2013-04-26 9 views

答えて

20

いいえ、Rubyはinitializeを自動的に呼び出しません。

Class#newのデフォルトの実装では、ビットのようになります:[。あなたはobj.send(:initialize, *args, &block)を使用する必要があるので、実際には、initializeはデフォルトでprivateある]

class Class 
    def new(*args, &block) 
    obj = allocate 
    obj.initialize(*args, &block) 
    obj 
    end 
end 

ので、Class#newのデフォルトの実装initializeと呼ばれますが、そうでない実装ではオーバーライドまたは上書きすることは可能です(極端に愚かですが)。

だからinitializeを呼び出すのはRubyで、それはClass#newです。 Class#newはRubyの不可欠な部分ですが、それは髪の毛を分割していると考えるかもしれませんが、ここで重要なのは言語魔法ではないということです。これは他の方法と同様の方法で、他の方法と同様に、完全に異なる処理を行うために上書きまたは上書きすることができます。

newを使用してオブジェクトを作成する代わりに、手動でallocateを使用する場合は、initializeも呼び出されません。

です。initializeを呼び出さずにオブジェクトを作成する場合があります。例えば。 dupまたはcloneを入力すると、initializeの代わりにinitialize_dupinitialize_cloneが呼び出されます(どちらもinitialize_copyとなります)。また、例えばMarshalを介してオブジェクトを逆シリアル化する場合、その内部状態はinitializeの代わりに直接再構成されます(つまり、インスタンス変数は反映されます)。

+0

派生クラスがその親の 'initialize'とどのようにやりとりするのかを言いたいですか? –

+0

@Jorge「上書き」とはどういう意味ですか?これを少しはっきりさせることができますか? –

+0

@Priti:Rubyには*オープンクラス*があり、既存のメソッドを新しい実装で上書きすることができます。 –

1

はい、これはnewメソッドから呼び出され、オブジェクトの作成に使用されます。

1

「明示的」という定義に依存します。

​​

これは持っているでしょう:暗黙の初期化のフォームを作成、使用できるインスタンスを生成ファクトリメソッドがあるいくつかのケースで

object = MyClass.new(...) 

:通常は、引数が指定されていない場合でも、する必要がありMyObject.newを内部的に呼び出す効果。これらは奇妙に見えるが、単にメソッド呼び出している可能性があるとして、

object = MyClass(...) 
object = MyClass[...] 

効果は同じである:

は次のように、かなり珍しいメソッドのシグネチャを持っているいくつかのライブラリがあります。

関連する問題