2012-08-12 19 views
35

Ayúdeme a obtener todas las variables de instancia declaradas en una clase de la misma manera instance_methods me muestra todos los métodos disponibles en una clase.Obtenga todas las variables de instancia declaradas en la clase

class A 
    attr_accessor :ab, :ac 
end 

puts A.instance_methods #gives ab and ac 

puts A.something   #gives me @ab @ac... 
+1

sigo sin tener ni idea de lo que esta segunda parte está pidiendo, o cómo se relaciona a la necesidad de obtener todos variables de instancia de un objeto. –

+0

Las variables de instancia no se declaran en ningún lado. Esta pregunta no tiene sentido. –

+1

variable "nombre" también se crea dinámicamente. –

Respuesta

46

Puede utilizar instance_variables:

A.instance_variables 

pero eso no es probablemente lo que usted desee, ya que recibe las variables de instancia en la clase A, no una instancia de esa clase. Así que es probable que desee:

a = A.new 
a.instance_variables 

Pero tenga en cuenta que sólo llamar attr_accessor no define ninguna variable de instancia (sólo define los métodos), por lo que no habrá ninguna en la instancia hasta que se establezca explícitamente.

a = A.new 
a.instance_variables #=> [] 
a.ab = 'foo' 
a.instance_variables #=> [:@ab] 
+0

¿Hay algún método en ruby ​​que cuente variables indefinidas? Como hemos proporcionado la lista en attr_accessor. Así que en algún lugar su entrada ya está hecha. Gracias por responder –

+0

@AkshayVishnoi 'attr_accessor: foo' solo genera' def foo; @foo; end' y 'def foo = (val); @foo = val; fin'. Nada está almacenado en ningún lado. –

+0

gracias por su ayuda, pero todavía no estoy encontrando mi manera de responder mi pregunta. Como señor, si tengo la clase 'Player' que contiene un nombre de variable. Ahora he inicializado 5 objetos. Ahora si quiero encontrar un número de jugadores con el nombre "Ak", ¿cómo generaría esta función dinámicamente en un Módulo? Di "MiMódulo", que está incluido en la clase "Jugador" Gracias por su cooperación –

6

Si desea obtener todas las variables de instancias valores que puede intentar algo como esto:

class A 
    attr_accessor :foo, :bar 

    def context 
    self.instance_variables.map do |attribute| 
     { attribute => self.instance_variable_get(attribute) } 
    end 
    end 
end 

a = A.new 
a.foo = "foo" 
a.bar = 42 
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }] 
Cuestiones relacionadas