Ruby initialize和self.new之间的区别

Ruby initialize和self.new之间的区别,ruby,Ruby,对不起,我不知道该怎么解释。下面两段代码之间有什么区别(如果有) class Foo def initalize end end class Foo def self.new allocate end end 此外,下面两种初始化类的方法有什么区别: Foo.new Foo.allocate allocate为Foo的实例分配内存,但不会初始化它 对已分配的对象调用initialize,以初始化Foo的实例(设置其初始值) new的默认实现调用这两个函数: clas

对不起,我不知道该怎么解释。下面两段代码之间有什么区别(如果有)

class Foo
  def initalize
  end
end

class Foo
  def self.new
    allocate
  end
end
此外,下面两种初始化类的方法有什么区别:

Foo.new
Foo.allocate
allocate
Foo
的实例分配内存,但不会初始化它

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

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

class Foo
  def self.new(*args, &blk)
    obj = allocate
    obj.initialize(*args, &blk)
    obj
  end
end
注意:
new
的默认实现通常是本机编写的(例如,对于MRI,用C编写),而不是用Ruby编写。上面的代码片段是与本机实现具有相同效果的Ruby

因此,您可以看到,这两者并不完全相同,尽管它们都用于构建
Foo
的新实例

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


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

相关问题:
new
如果通过一个块,也会传递它的块。这很有意义。我过去认为初始化和分配是一样的,因为返回值是相似的。