11

初期化メソッドがクラス定義に含まれている場合、オブジェクトを明示的に初期化する必要がありますか?

4

3 に答える 3

23

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

のデフォルトの実装は、Class#new次のようになります。

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

[実際にinitializeprivateがデフォルトなので、使用する必要があります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

于 2013-04-27T00:22:04.197 に答える
1

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

于 2013-04-26T21:15:06.837 に答える
1

「明示的」の定義によって異なります。引数がない場合でも、通常は次のようにする必要があります。

object = MyClass.new(...)

場合によっては、暗黙的な初期化の形式を作成して、使用できるインスタンスを生成するファクトリ メソッドがあります。

object = MyClass.factory_method(...)

MyObject.newこれには、内部呼び出しの効果があります。

次のような、かなり変わったメソッド シグネチャを持つライブラリがいくつかあります。

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

これらは奇妙に見えるかもしれませんが、単なるメソッド呼び出しであるため、効果は同じです。

于 2013-04-26T21:16:14.913 に答える