抱歉,我不确定如何解释这个解释。下面两段代码之间有什么区别(如果有的话)?
class Foo
def initalize
end
end
class Foo
def self.new
allocate
end
end
此外,下面初始化一个类的两种方法之间有什么区别:
Foo.new
Foo.allocate
答案 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
,即使它们不需要初始化,因为它抽象了内存的分配。)