2011-06-15 15 views
11

Supongamos que tengo una clase llamada Publicación que tiene muchas instancias iniciadas (es decir, Post.new(:name => 'foo')).¿Cómo obtener instancias de clase en Ruby?

¿Hay alguna forma de recuperar todas las instancias de esa clase llamando algo sobre ella? Estoy buscando algo en la línea de Post.instances.all

Ideas?

Gracias!

+1

Probablemente se podría almacenar una lista de referencia de forma manual que actualice desde el constructor ... pero tengo curiosidad por qué se necesita para hacer eso? – Locksfree

Respuesta

18

que ilustran dos de las respuestas y PreciousBodilyFluids alphazero:

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

si una instancia se destruyó, se actualizará este '@@ instance_collector'. – Vijay

+0

@Vijay respuesta corta es no, porque no hay LOC que elimine el objeto de la matriz. – onebree

7

Anular nuevo; mantener el conteo; exponer propiedad.

+0

+1 Corto, dulce, al punto. –

21

Puede utilizar ObjectSpace para recuperar todos los objetos instanciados de una clase dada:

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

Esto es casi seguro que una mala idea, aunque - por ejemplo, también se cargará casos Post que todavía están en la memoria de solicitudes anteriores que no se han recogido basura. Probablemente haya una forma mucho mejor de llegar a las publicaciones que le interesan, pero necesitaremos más información sobre lo que está tratando de hacer.

Cuestiones relacionadas