Class#allocate及其用途

Rob*_*owe 20 ruby memory-management

阅读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手动分配对象有什么用?我读过的文章展示了一个自定义初始化方法,但它的用途是如此有限?

Gre*_*own 19

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
Run Code Online (Sandbox Code Playgroud)

尽管文档说的是,该allocate方法的存在并不是关于内存管理,而是关于对对象创建生命周期提供一些更细粒度的控制.大多数情况下,您不需要此功能,但它对某些边缘情况很有用.

例如,在Newman邮件框架中,我使用这种技术为TestMailer对象实现伪构造函数; 它实现了newAPI兼容性的方法,但实际上返回了一个实例,无论它被调用了多少次:

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
Run Code Online (Sandbox Code Playgroud)

除了重新定义之外,我还没有看到很多其他用例,new如上所示(尽管我认为一些奇怪的序列化内容也使用了这个功能).但考虑到这一点,值得指出的是,Ruby始终提供这些类型的扩展点,无论您是否需要定期使用它们.Robert Klemme有一篇很棒的文章叫做The Complete Class,如果你想看看这个设计概念在Ruby中有多远,我强烈推荐阅读:-)

  • 谢谢你,我也特别喜欢你给出的现实世界的例子。 (2认同)
  • [`Singleton`](http://ruby-doc.org/stdlib-2.3.1/libdoc/singleton/rdoc/Singleton.html)可以用于你的用例,不是吗? (2认同)