阅读了http://www.seejohncode.com/2012/03/16/ruby-class-allocate/并进一步了解了分配方法:http://www.ruby-doc.org/core-1.9.3/Class.html#method-i-allocate我变得非常好奇。
Ruby的构建方式是我们没有为对象手动分配或释放空间,但我们有能力这样做。为什么呢?
Ruby手动分配对象有什么用?我读过的文章展示了一个自定义初始化方法,但它的用途是如此有限?
答案 0 :(得分:17)
allocate
存在的主要原因是允许您为对象构建自定义构造函数。正如您提到的文章所述,您可以将SomeClass.new
方法设想为默认情况下执行以下操作:
class SomeClass
def self.new(*a, &b)
obj = allocate
# initialize is a private instance method by default!
obj.send(:initialize, *a, &b)
end
end
尽管文档说的是,allocate
方法的存在并不是关于内存管理,而是关于对对象创建生命周期提供一些更细粒度的控制。大多数情况下,您不需要此功能,但它对某些边缘情况很有用。
例如,在Newman邮件框架中,我使用此技术将implement a fake constructor用于TestMailer对象;它为API兼容性实现了new
方法,但实际上无论调用多少次都返回一个实例:
class Newman::TestMailer
def self.new(settings)
return self.instance if instance
# do some Mail gem configuration stuff here
self.instance = allocate
end
attr_accessor :instance
end
除了重新定义new
之外,我还没有看到很多其他用例,如上所示(尽管我认为一些奇怪的序列化内容也使用了这个功能)。但考虑到这一点,值得指出的是,Ruby始终提供这些类型的扩展点,无论您是否需要定期使用它们。罗伯特·克莱姆(Robert Klemme)有一篇很棒的文章叫The Complete Class,如果你想看看这个设计概念在Ruby中有多远,我强烈推荐阅读: - )