有沒有辦法計數金額實例只要程序正在運行就會創建?紅寶石類的計數初始化
喜歡的東西
class Foo
@bar = 0
def initialize
@bar += 1
end
end
將無法正常工作(@bar
是initialize
nil
)。
這可以以某種方式完成嗎?
有沒有辦法計數金額實例只要程序正在運行就會創建?紅寶石類的計數初始化
喜歡的東西
class Foo
@bar = 0
def initialize
@bar += 1
end
end
將無法正常工作(@bar
是initialize
nil
)。
這可以以某種方式完成嗎?
實例變量屬於對象(也稱實例),這就是爲什麼它們被稱爲實例變量畢竟。您的第一個@bar
是Foo
的實例變量,您的第二個@bar
是Foo
的新創建實例的實例變量。這些是兩個完全不同的對象(它們甚至不是同一類別:新創建的實例類別爲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
,但實際上直接使用解釋器內部實現。
這對我有用。感謝您的詳細解答! –
你應該使用一個類變量而不是一個實例變量:
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
感謝您的回答。那麼,這個例子確實有效,但對我來說,這不是一個解決方案,因爲我需要計算三個類的實例,這三個類都可以擴展一個模塊。我無法弄清楚如何將它用作模塊中的類變量。 –
請參閱:http://stackoverflow.com/questions/16794896/how-to-count-existing-instances-of-a-class-in-ruby – tomsoft
您是否關心被遺棄和垃圾收集的實例? –