23

http://www.seejohncode.com/2012/03/16/ruby-class-allocate/を読み、allocateメソッドを詳しく調べた後:http ://www.ruby-doc.org/core-1.9.3 /Class.html#method-i-allocate私は非常に興味を持ちました。

Rubyは、オブジェクト用またはオブジェクトを使用してスペースを手動で割り当てたり解放したりする必要がない方法で構築されましたが、そうすることができます。なんで?

Rubyでオブジェクトを手動で割り当てる用途は何ですか?私が読んだ記事はカスタム初期化メソッドを示しましたが、それの使用はそれほど制限されていますか?

4

1 に答える 1

24

主な理由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でどの程度採用されているかを知りたい場合は、この記事を読むことを強くお勧めします:-)

于 2012-11-07T17:33:13.073 に答える