ruby是否自动调用initialize方法?
如果在类定义中包含initialize方法,是否需要显式初始化对象?
不,Ruby不会自动调用initialize
。
Class#new
的默认实现看起来有点像这样:
class Class def new(*args, &block) obj = allocate obj.initialize(*args, &block) obj end end
[实际上,默认情况下initialize
是private
,因此您需要使用obj.send(:initialize, *args, &block)
。]
因此, Class#new
的默认实现会调用initialize
,但完全可能(尽管非常愚蠢)使用不实现的实现覆盖或覆盖它。
所以,调用initialize
并不是Ruby ,它是Class#new
。 你可能认为这是分裂的,因为Class#new
是Ruby的一个组成部分,但重要的是:它不是某种语言魔法。 这是一种类似于任何其他方法的方法,并且像任何其他方法一样,它可以被覆盖或覆盖以完成不同的操作。
当然,如果你不使用new
来创建一个对象,而是使用allocate
手动执行它,那么也不会调用initialize
。
在某些情况下,无需调用initialize
即可创建对象。 例如,当clone
或clone
,调用initialize_dup
和initialize_clone
而不是initialize
(两者都调用initialize_copy
)。 并且,当通过Marshal
反序列化对象时,其内部状态将直接重建(即实例变量被reflection设置),而不是通过initialize
。
是的,它是从用于创建对象的new
方法调用的。
这取决于你对“显性”的定义。 通常你需要,即使没有参数:
object = MyClass.new(...)
在某些情况下,有工厂方法可以生成可以使用的实例,从而创建一种隐式初始化forms:
object = MyClass.factory_method(...)
这将在内部调用MyObject.new
。
有一些库有相当不寻常的方法签名,如:
object = MyClass(...) object = MyClass[...]
效果是一样的,因为这些可能看起来很奇怪但只是方法调用。