それらのオブジェクトを定義するクラス内で、特定のクラスのオブジェクトのインスタンスの数を保持しようとしています。
まず第一に、私はコード リフレクションと ObjectSpace.each_object を認識していますが、リフレクションを使用せず、クラス自体がそれ自体を「管理」できるようにしたいと考えています。
私が見回したところ、見つかったすべてのソリューションは、たとえば、この質問に対する受け入れられた回答のように、クラス定義で @@class_variables を使用しているようです: Rubyでクラスインスタンスを取得する方法?
しかし、読み続けていると、ルビーのクラス変数が状況によっては非常に悪い動作をすることがあることがわかりました...最大の理由は次のとおりです。
プログラムのトップレベルで定義されたクラス変数は、すべてのクラスに継承されます。グローバル変数のように動作します。
ソースと詳細情報はこちら: http://ruby.runpaint.org/variables#class
それで、クラス変数の代わりにクラスインスタンス変数を使用して、インスタンス化されたオブジェクトの数を内部に格納するクラスをコーディングしようとしましたが、どうやらうまくいくようですが、この「深い」言語についてまだ学んでいるので私が書いたコードが正しいかどうか、および/または意味があるかどうかをお尋ねしたいトピック:
class Pizza
@orders = 0
def self.new
@orders += 1
end
def self.total_orders
@orders
end
end
new_pizza = Pizza.new #=> 1
special_pizza = Pizza.new #=> 2
fav_pizza = Pizza.new #=> 3
私の疑問の 1 つは、Pizza.new メソッドをオーバーライドすると、元の .new メソッドのいくつかの重要な機能が「削除」されることですか? (元の .new メソッドは何を提供しますか?? リフレクションを使用してメソッド コードを「検査」するにはどうすればよいですか?) 他に間違っていること、または私のアプローチで完全に間違っていることとその理由は?
ありがとう
編集:この重要なビットを追加するのを忘れました:
範囲をより適切に制限する方法として、Pizza クラスがオブジェクトのインスタンス化時にのみカウントできるようにし、コード内でいつでもアクセスできる @instance クラス変数にセッター メソッドを持たないようにしたいと考えています。 (Pizza.count = 1000)。そのため、「new」をオーバーライドしようとしていました。
これは、自分のアプローチが正しい方向に進んでいるのか、または単にこれらの言語メカニズムにあまり依存するのをやめて、オブジェクトがPizza クラスが ObjectSpace に入りました。
私は、言語機能を使用してこれを取得するための、よりエレガントで肥大化していない方法を探しています..
どちらの場合でも、助けていただければ幸いです..
再度、感謝します。