主な理由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オブジェクトの偽のコンストラクターを実装しました。API互換性のためのメソッドを実装しましたnew
が、実際には、呼び出された回数に関係なく、単一のインスタンスを返しました。
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でどの程度採用されているかを知りたい場合は、この記事を読むことを強くお勧めします:-)