2011-06-15 68 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 

这几乎可以肯定是一个坏主意,虽然 - 例如,它也将加载仍然在内存中,从发布实例先前的请求没有被垃圾回收。有可能有更好的方式来获得你关心的帖子,但是我们需要更多关于你想要做什么的信息。