模块Mixin实例跟踪器

时间:2012-06-25 18:53:27

标签: ruby class object module mixins

我有以下代码,它跟踪一个类的实例数量:

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

但是当我这样做时,NoMethodError获得了Foo.instances。如果我将InstanceTracker作为一个类并执行此操作,它可以正常工作:

class Foo < InstanceTracker; end

如何将其作为模块混合?

1 个答案:

答案 0 :(得分: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中的def self.instances会导致您的代码失败。例如,方法声明,使用方法的简单名称。

BTW,您的代码将使解释器迭代每个单个对象,并使用每个方法调用测试它们中的每一个。 我建议你破解类new方法,这样它会增加一个类变量,使这个变量可以通过属性读取器访问。