2012-03-14 13 views
2

"new"を呼び出すことによってオブジェクトを作成するのは変ですが、クラス定義では初期化子を "initialize"と呼びます。私はそれが一貫作ってみました(クラス定義と外側の両方に「新」と呼ばれることにする)ので、私はalias_methodを使用して、以下のコードを試してみました:Rubyでエイリアスを初期化する方法は?

class Class 
    alias_method :initialize :new 
end 

class Foo 
    def new 
     puts "bar" 
    end 
end 

f = Foo.new 

私はinitializeとしてnewを別名とき、それはinitializeを呼び出しますと思いました、 initializenewのエイリアスですので、newを呼び出します。しかし、働いて、エラーを与えていない:

SyntaxError: test.rb:2: syntax error, unexpected ':' 

    alias_method :initialize :new 
          ^

どうやらnewがキーワードであるとエイリアスすることはできません。しかし、周りどのような方法ですか?


アップデート:私はカンマを追加した後alias_method

にカンマを逃した申し訳

、スクリプトがエラーなしで実行されます。しかし、 "bar"は出力されないので、新しいメソッドは呼び出されません。これがなぜ以下のコメントとして機能しないのかわかりません。

+0

'alias_method:initialize、:new'(カンマに注意してください)を使用する必要があることに注意してください。しかし、私はこれが単にできないと思う。 – maerics

答えて

0

Object#initializeを無効にすることがどのような意味を持っているかわかりません。私は私のコードでこれを夜によく眠れないだろうが、どのようにのようなものについて:

​​
+0

それはそうです!無限ループに関する警告を出し、 'オブジェクト'を 'BasicObject'に変更しました。これは完璧に動作します! – texasbruce

+0

@texasbruceこれは、 'Classを使うスクリプトを破ります。新しいクラスを作成するときは、新しいクラスが作成されたときに再び呼び出され、クラス自体ではなく新しいクラスの*インスタンス*を返します。 – Gareth

+0

以前はその懸念がありましたが、私は新しいメソッドがプライベートであり、外部からアクセスできないことを認識しているので、システム 'Class.new'が最初に呼び出されます。オブジェクトが作成された後、再びnewを呼び出すと、Foo.newがそれをオーバーライドするので、Class.newは呼び出されません。 – texasbruce

6

initializenewは異なることに注意してください。具体的には、newはクラスメソッドであり、initializeはインスタンスメソッドです。

newは「新しい」オブジェクトの作成、メモリの割り当てなどを行い、オブジェクトが作成されると、それ自体を設定するように要求することによってinitializedになります。

newは、this blog exampleに示されているように、確実に上書きすることができますが、非常に正当な理由がある場合を除き、これをやりたくはありません。

+0

"初期化"を無効にすることはできますか? – texasbruce

+1

もちろん、それはクラスの作成方法をカスタマイズする主な方法です。 – Gareth

1

エラーが新しいというキーワードについてだけではなく、alias_methodのためのあなたの構文も間違っています。エラーが示すように、2つの関数名の間に "、"を入れる必要があります。あなたのケースでは正しい構文は次のようになります。

alias_method :initialise, :new 

次のようにalias_methodのデフォルトの形式は次のとおりです。

alias_method :new_function_name, :old_function_name. 

また、あなたが「alias_methodが」もはやレールに良いプログラミングの練習を考えられていることに注意してはなりません対応する条件文とともに "super"キーワードを使用する必要があります。

関連する問題