2015-08-27 152 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

感謝您的回答。那麼,這個例子確實有效,但對我來說,這不是一個解決方案,因爲我需要計算三個類的實例,這三個類都可以擴展一個模塊。我無法弄清楚如何將它用作模塊中的類變量。 –

相關問題