我有以下代码,它跟踪一个类的实例数量:
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
如何将其作为模块混合?
答案 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
会导致您的代码失败。例如,方法声明,使用方法的简单名称。
new
方法,这样它会增加一个类变量,使这个变量可以通过属性读取器访问。