新分配和初始化

在许多语言中,使用特殊的 new 关键字创建类的新实例。在 Ruby 中,new 也用于创建类的实例,但它不是关键字; 相反,它是一个静态/类方法,与任何其他静态/类方法没有区别。定义大致如下:

class MyClass
   def self.new(*args)
     obj = allocate
     obj.initialize(*args) # oversimplied; initialize is actually private
     obj
   end
end

allocate 执行创建类的未初始化实例的真正魔力

另请注意,initialize 的返回值将被丢弃,而是返回 obj。这使得你可以立即清楚为什么你可以编写初始化方法,而无需担心最后返回 self

所有类从 Class 获得的正常new 方法如上所述,但是可以根据需要重新定义它,或者定义不同的替代方法。例如:

class MyClass
  def self.extraNew(*args)
    obj = allocate
    obj.pre_initialize(:foo)
    obj.initialize(*args)
    obj.post_initialize(:bar)
    obj
  end
end