阅读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 中手动分配对象的用途是什么?我读的文章显示了一个自定义的初始化方法,但它的用途有这么有限吗?
阅读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 中手动分配对象的用途是什么?我读的文章显示了一个自定义的初始化方法,但它的用途有这么有限吗?
存在的主要原因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 邮件框架中,我使用这种技术为 TestMailer 对象实现了一个假构造函数;它实现了new
API 兼容性的方法,但实际上返回了一个实例,而不管它被调用了多少次:
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 中的应用程度,我强烈推荐阅读这篇文章 :-)