初期化メソッドがクラス定義に含まれている場合、オブジェクトを明示的に初期化する必要がありますか?
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。たとえば、duping またはcloneing の場合、initialize_dupandinitialize_cloneは代わりに呼び出されますinitialize(両方とも、次に call initialize_copy)。また、たとえば を介してオブジェクトをデシリアライズする場合Marshal、その内部状態は を介してではなく、直接再構築されます (つまり、インスタンス変数は反射的に設定されます) initialize。
はい、newオブジェクトの作成に使用するメソッドから呼び出されます。
「明示的」の定義によって異なります。引数がない場合でも、通常は次のようにする必要があります。
object = MyClass.new(...)
場合によっては、暗黙的な初期化の形式を作成して、使用できるインスタンスを生成するファクトリ メソッドがあります。
object = MyClass.factory_method(...)
MyObject.newこれには、内部呼び出しの効果があります。
次のような、かなり変わったメソッド シグネチャを持つライブラリがいくつかあります。
object = MyClass(...)
object = MyClass[...]
これらは奇妙に見えるかもしれませんが、単なるメソッド呼び出しであるため、効果は同じです。