ruby – class#allocation及其用途

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

解决方法

分配存在的主要原因是允许您为对象构建自定义构造函数.作为您链接文章,您可以将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

尽管文档说明了什么,但是分配方法的存在并不是关于内存管理那么多,而是关于在对象创建生命周期中提供更精细的粒度控制.大多数情况下,您不需要此功能,但它对某些边缘情况非常有用.

例如,在Newman邮件框架中,我将此技术用于implement a fake constructor for TestMailer对象;它实现了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

除了如上所示重新定义新的内容,我还没有看到很多其他用例(尽管我想象一些奇怪的序列化的东西也使用这个功能).但是考虑到这一点,值得一提的是,Ruby始终提供这些扩展点,无论您是否需要定期使用它们.罗伯特·克莱姆(Robert Klemme)有一篇名为The Complete Class的伟大文章,我强烈推荐阅读,如果你想看看这个设计理念在Ruby中有多远:-)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...