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