新分配和初始化
在許多語言中,使用特殊的 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