0

クラスのインスタンスの数を追跡する次のコードがあります。

module InstanceTracker
  def self.instances
    counter = 0
    ObjectSpace.each_object do |i|
      if i.class == self
        counter += 1
      end
    end
    return counter
  end
end

エンドユーザーにできることは次のとおりです。

class Foo
  include InstanceTracker
end

しかし、それを行うと、NoMethodErrorforが得られFoo.instancesます。InstanceTrackerをクラスにして、次のようにすると正常に動作します。

class Foo < InstanceTracker; end

どうすればモジュールミックスインにできますか?

4

1 に答える 1

2

私はあなたのコードで少し遊んだ。どうやら、呼び出し元のクラスではなく、インスタンスのクラスを呼び出し元と比較していたようです。これを試して:

module InstanceTracker
  def instances
    counter = 0
    ObjectSpace.each_object do |i|
      if i.class == self.class
        counter += 1
      end
    end
    return counter
  end
end

私のために働いた。

selfまた、 indef self.instancesによってコードが失敗することに注意してください。インスタンス メソッドの宣言では、メソッドの単純な名前を使用します。

ところで、コードにより、インタープリターはすべての単一オブジェクトを反復処理し、各メソッド呼び出しでそれぞれをテストします。クラスのメソッドをハックしてnew、クラス変数をインクリメントし、属性リーダーを介してこの変数にアクセスできるようにすることをお勧めします。

于 2012-06-25T19:13:39.327 に答える