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

为我工作。

另外,请注意selfindef self.instances将导致您的代码失败。对于实例方法声明,使用方法的简单名称。

顺便说一句,您的代码将导致解释器遍历每个对象并在每个方法调用中测试每个对象。我建议你破解类的new方法,以便它增加一个类变量,使这个变量可以通过属性读取器访问。

于 2012-06-25T19:13:39.327 回答