2015-08-27 106 views
-2

有没有办法计数金额实例只要程序正在运行就会创建?红宝石类的计数初始化

喜欢的东西

class Foo  
    @bar = 0 

    def initialize 
     @bar += 1 
    end 
end 

将无法​​正常工作(@barinitializenil)。

这可以以某种方式完成吗?

+0

请参阅:http://stackoverflow.com/questions/16794896/how-to-count-existing-instances-of-a-class-in-ruby – tomsoft

+0

您是否关心被遗弃和垃圾收集的实例? –

回答

0

实例变量属于对象(也称实例),这就是为什么它们被称为实例变量毕竟。您的第一个@barFoo的实例变量,您的第二个@barFoo的新创建实例的实例变量。这些是两个完全不同的对象(它们甚至不是同一类别:新创建的实例类别为Foo,而Foo属于类别Class)。

您显然需要在Foo上调用的方法中增加@bar,而不是在Foo的实例上调用的方法中。那么,我们可以考虑一种方法:a)在Foo上调用,b)每次创建一个实例时调用?那么new呢?

class Foo 
    @bar = 0 

    def self.new(*) 
    @bar += 1 
    super 
    end 
end 

好了,从技术上来说,这并不算实例的数量,只有次new数被调用。有时候,创建实例时不需要调用new,例如当反序列化时。这应该是最接近你可以得到,而不诉诸解释器内部的丑陋黑​​客。

你可能会认为你可以覆盖allocate而不是(我也这么认为),但我只是测试它,它不起作用。据推测,new的默认实现不通过正常方式调用allocate,但实际上直接使用解释器内部实现。

+1

这对我有用。感谢您的详细解答! –

1

你应该使用一个类变量而不是一个实例变量:

class Foo 
    @@count = 0 
    def initialize 
    @@count += 1 
    end 

    def Foo.get_count 
    @@count 
    end 
end 

foo1 = Foo.new 
foo2 = Foo.new 
foo3 = Foo.new 

puts Foo.get_count 
# => 3 
+0

感谢您的回答。那么,这个例子确实有效,但对我来说,这不是一个解决方案,因为我需要计算三个类的实例,这三个类都可以扩展一个模块。我无法弄清楚如何将它用作模块中的类变量。 –

相关问题