新分配和初始化

在許多語言中,使用特殊的 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