阅读
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的构建方式是我们不必手动分配或释放空间用于/与对象,但是我们有能力这样做.为什么?
解决方法
分配存在的主要原因是允许您为对象构建自定义构造函数.作为您链接的文章,您可以将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中有多远:-)