ruby是否自动调用initialize方法?

One*_*ero 9 ruby

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

Jör*_*tag 22

不,Ruby不会initialize自动调用.

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

class Class
  def new(*args, &block)
    obj = allocate
    obj.initialize(*args, &block)
    obj
  end
end
Run Code Online (Sandbox Code Playgroud)

[其实initializeprivate在默认情况下,所以你需要使用obj.send(:initialize, *args, &block).]

因此,默认的实现Class#new initialize,但它是完全有可能(尽管愚蠢至极)覆盖或用未实现覆盖.

所以,调用它不是Rubyinitialize,而是Class#new.你可能认为这是分裂的头发,因为它Class#new是Ruby不可或缺的一部分,但重要的是:它不是某种语言魔法.这是一个像任何其他方法一样的方法,就像任何其他方法一样,它可以被覆盖或覆盖以完成不同的操作.

当然,如果你不是new用来创建一个对象而是用手工创建它allocate,那么initialize也不会被调用.

这里一些情况下,无需调用创建对象initialize.例如,当dup荷兰国际集团或cloneING,initialize_dupinitialize_clone被调用,而不是initialize(这两者,反过来,呼叫initialize_copy).并且,当通过比较反序列化对象时Marshal,其内部状态被直接重建(即实例变量被反射地设置)而不是通过initialize.