initialize和self.new之间的区别

avi*_*bot 4 ruby

对不起,我不知道如何解释这个解释.下面两段代码之间有什么区别(如果有的话)?

class Foo
  def initalize
  end
end

class Foo
  def self.new
    allocate
  end
end
Run Code Online (Sandbox Code Playgroud)

此外,下面初始化类的两种方法之间的区别是什么:

Foo.new
Foo.allocate
Run Code Online (Sandbox Code Playgroud)

amn*_*mnn 6

allocate 为实例分配内存Foo不初始化它.

initialize在已分配的对象上调用以初始化(设置其初始值)的实例Foo.

new调用这两个的默认实现:

class Foo
  def self.new(*args, &blk)
    obj = allocate
    obj.initialize(*args, &blk)
    obj
  end
end
Run Code Online (Sandbox Code Playgroud)

注意:默认实现new通常是本机编写的(例如,在C中,用于MRI),而不是在Ruby中.上面的代码片段是Ruby,它与本机实现具有相同的效果.

所以你看,两者并不完全相同,尽管它们都用于构造新的实例Foo.

如果你的initialize方法一开始是空的,并且它没有参数,那么是的,你可以用你Foo.new本质上是别名的替换你的定义Foo.allocate,但在所有其他情况下,只有通过调用Foo.new才能得到一个正确的初始化版本你的对象.

(我建议坚持只调用new你的类,即使它们不需要初始化,因为它抽象了内存的分配).

  • 如果你通过它,`new`也会沿着它的块传递. (3认同)