2011-06-15 133 views
11

假設我有一個名爲Post的類,它有許多啓動的實例(即Post.new(:name => 'foo'))。如何在Ruby中獲取類實例?

有沒有辦法通過調用它的東西來檢索該類的所有實例? 我在找東西沿線Post.instances.all

想法?

謝謝!

+1

你也許可以手動存儲的參考列表,您從構造函數更新......但我很好奇,爲什麼你需要做的是什麼? – Locksfree 2011-06-15 23:33:15

回答

18

龍虎鬥都alphazero的和PreciousBodilyFluids答案:

class Foo 
    @@instance_collector = [] 
    def initialize 
    @@instance_collector << self 
    #other stuff 
    end 
    def self.all_offspring 
    @@instance_collector 
    end 
end 

a = Foo.new 
b = Foo.new 

p Foo.all_offspring # => [#<Foo:0x886d67c>, #<Foo:0x886d668>] 
p ObjectSpace.each_object(Foo).to_a # => [#<Foo:0x886d668>, #<Foo:0x886d67c>] #order is different 
+0

如果一個實例出現故障,這個「@@ instance_collector」會被更新。 – Vijay 2015-04-23 06:19:34

+0

@Vijay簡短回答是否定的,因爲沒有LOC從數組中刪除對象。 – onebree 2016-01-05 15:31:48

7

重寫新;繼續計數;公開財產。

+0

+1簡短,甜美,至點。 – 2011-06-15 23:39:46

21

您可以使用ObjectSpace檢索給定類的所有實例化對象:

posts = [] 
ObjectSpace.each_object Post do |post| 
    posts << post 
end 

這幾乎可以肯定是一個壞主意,雖然 - 例如,它也將加載仍然在內存中,從發佈實例先前的請求沒有被垃圾回收。有可能有更好的方式來獲得你關心的帖子,但是我們需要更多關於你想要做什麼的信息。