微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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中有多远:-)

原文地址:https://www.jb51.cc/ruby/273961.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐