initialize和self.new之间的区别

时间:2014-06-09 23:08:36

标签: ruby

抱歉,我不确定如何解释这个解释。下面两段代码之间有什么区别(如果有的话)?

class Foo
  def initalize
  end
end

class Foo
  def self.new
    allocate
  end
end

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

Foo.new
Foo.allocate

1 个答案:

答案 0 :(得分:6)

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

在已分配的对象上调用

initialize来初始化(设置初始值)Foo的实例。

new的默认实现会调用以下两种方法:

class Foo
  def self.new(*args, &blk)
    obj = allocate
    obj.initialize(*args, &blk)
    obj
  end
end

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

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

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

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