初期化メソッドがクラス定義に含まれている場合、オブジェクトを明示的に初期化する必要がありますか?
3 に答える
initialize
いいえ、Ruby は自動的に呼び出しません。
のデフォルトの実装は、Class#new
次のようになります。
class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
obj
end
end
[実際にinitialize
はprivate
がデフォルトなので、使用する必要がありますobj.send(:initialize, *args, &block)
。]
したがって、のデフォルトの実装Class#new
はcallinitialize
を呼び出しますが、そうでない実装でそれをオーバーライドまたは上書きすることは完全に可能です (非常にばかげていますが)。
つまり、を呼び出すのはRubyinitialize
ではなく、Class#new
です。Class#new
これは、Ruby の不可欠な部分であるため、髪を分割していると思うかもしれませんが、ここで重要なことは、言語の魔法のようなものではないということです。これは他のメソッドと同じであり、他のメソッドと同様に、オーバーライドまたは上書きして、まったく異なることを行うことができます。
もちろん、 を使用new
してオブジェクトを作成せず、 を使用して手動で作成した場合も、allocate
呼び出さinitialize
れません。
を呼び出さずにオブジェクトを作成する場合がありますinitialize
。たとえば、dup
ing またはclone
ing の場合、initialize_dup
andinitialize_clone
は代わりに呼び出されますinitialize
(両方とも、次に call initialize_copy
)。また、たとえば を介してオブジェクトをデシリアライズする場合Marshal
、その内部状態は を介してではなく、直接再構築されます (つまり、インスタンス変数は反射的に設定されます) initialize
。
はい、new
オブジェクトの作成に使用するメソッドから呼び出されます。
「明示的」の定義によって異なります。引数がない場合でも、通常は次のようにする必要があります。
object = MyClass.new(...)
場合によっては、暗黙的な初期化の形式を作成して、使用できるインスタンスを生成するファクトリ メソッドがあります。
object = MyClass.factory_method(...)
MyObject.new
これには、内部呼び出しの効果があります。
次のような、かなり変わったメソッド シグネチャを持つライブラリがいくつかあります。
object = MyClass(...)
object = MyClass[...]
これらは奇妙に見えるかもしれませんが、単なるメソッド呼び出しであるため、効果は同じです。