ruby是否自动调用initialize方法?

如果在类定义中包含initialize方法,是否需要显式初始化对象?

不,Ruby不会自动调用initialize

Class#new的默认实现看起来有点像这样:

 class Class def new(*args, &block) obj = allocate obj.initialize(*args, &block) obj end end 

[实际上,默认情况下initializeprivate ,因此您需要使用obj.send(:initialize, *args, &block) 。]

因此, Class#new的默认实现调用initialize ,但完全可能(尽管非常愚蠢)使用不实现的实现覆盖或覆盖它。

所以,调用initialize并不是Ruby ,它是Class#new 。 你可能认为这是分裂的,因为Class#new是Ruby的一个组成部分,但重要的是:它不是某种语言魔法。 这是一种类似于任何其他方法的方法,并且像任何其他方法一样,它可以被覆盖或覆盖以完成不同的操作。

当然,如果你不使用new来创建一个对象,而是使用allocate手动执行它,那么也不会调用initialize

在某些情况下,无需调用initialize即可创建对象。 例如,当cloneclone ,调用initialize_dupinitialize_clone而不是initialize (两者都调用initialize_copy )。 并且,当通过Marshal反序列化对象时,其内部状态将直接重建(即实例变量被reflection设置),而不是通过initialize

是的,它是从用于创建对象的new方法调用的。

这取决于你对“显性”的定义。 通常你需要,即使没有参数:

 object = MyClass.new(...) 

在某些情况下,有工厂方法可以生成可以使用的实例,从而创建一种隐式初始化forms:

 object = MyClass.factory_method(...) 

这将在内部调用MyObject.new

有一些库有相当不寻常的方法签名,如:

 object = MyClass(...) object = MyClass[...] 

效果是一样的,因为这些可能看起来很奇怪但只是方法调用。