2011-06-15 12 views
11

Çok sayıda başlatılmış örneğe sahip olan Post adında bir sınıfım olduğunu varsayalım (ör. Post.new(:name => 'foo')).Ruby'de sınıf örnekleri nasıl alınır?

Bu sınıfa bir şey çağırarak tüm örneklerini almanın bir yolu var mı? Ben satırlar boyunca bir şey mi arıyorum Post.instances.all

Fikirler?

Teşekkürler!

+1

Muhtemelen kurucusundan güncellemenizi elle referans listesini depolayabilir ... ama merak ediyorum? – Locksfree

cevap

18

açıklamak üzere alphazero en ve PreciousBodilyFluids her iki cevap: bunu yapmak gerekir neden

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

Eğer bir örnek denirse, bu '@ instance_collector' güncellenecektir. – Vijay

+0

@Vijay kısa yanıtı hayır, çünkü nesneyi diziden kaldıran LOC yok. – onebree

7

Yeni geçersiz kıl; saymaya devam et; mülkiyeti ifşa etmek. - örneğin, o da gelen bellekte hala Mesaj örneklerini yükleyecektir

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

Bu da, hemen hemen kesin kötü bir fikirdir:

+0

+1 Kısa, tatlı, noktaya. –

21

Belirli bir sınıfın tüm örneği nesneleri almak için ObjectSpace kullanabilirsiniz daha önce çöp toplanmamış olan talepler. Önemsediğiniz yayınlara ulaşmak için muhtemelen daha iyi bir yol var, ancak yapmaya çalıştığınız şey hakkında daha fazla bilgiye ihtiyacımız var.

İlgili konular