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