2010-05-13 22 views
10

Tengo una clase de Ruby. Quiero obtener una variable de instancia de un argumento a un método en esa clase. No puedo conseguir todas las variables de instancia como una matriz:En Ruby, ¿cómo puedo obtener variables de instancia en un hash en lugar de una matriz?

self.instance_variables 

Sin embargo, quiero obtener la variable de instancia con nombre arg, específicamente:

class MyClass 
    def get_instance_variable(arg) 
    hash_of_instance_variables[arg] 
    end 
end 

object.get_instance_variable('my_instance_var') 

¿Cómo calculo hash_of_instance_variables?

+0

¿Puede dar más detalles? Tu pregunta no es muy clara. –

+4

Parece que está esperando construir un hash que correlacione las variables de instancia con sus valores para que pueda recuperar el valor de la variable de instancia. Si es así, ¿por qué? Use 'instance_variable_get'. – cam

Respuesta

17

Para crear un hash de todas las variables de instancia que puede utilizar el siguiente código:

class Object 
    def instance_variables_hash 
    Hash[instance_variables.map { |name| [name, instance_variable_get(name)] } ] 
    end 
end 

Pero como leva mencionó en su comentario, usted debe utilizar instance_variable_get método en su lugar:

object.instance_variable_get :@my_instance_var 
1
class MyClass  
def variables_to_hash 
     h = {} 
     instance_variables.each{|a| 
     s = a.to_s 
     n = s[1..s.size] 
     v = instance_variable_get a 
     h[n] = v 
     } 
     h 
    end 
end 
+0

Tenga en cuenta que 's [1..s.size]' se puede reemplazar por 's [1 ..- 1]'. –

5

La pregunta es bastante antigua, pero encontró una solución de rieles para esto: instance_values

Esta es la primera respuesta en Google, así que quizás ayude a alguien.

+0

Gracias por ayudar a la comunidad. Ya no uso ruby ​​/ rails, pasé a node.js. Bests –

+0

El código utilizado por Rails es casi idéntico a la respuesta aceptada, con la excepción de que Rails elimina el '@' principal. –

-1

Ruby on Rails tiene un par de formas incorporadas para hacer esto que usted puede encontrar para satisfacer sus necesidades.

user = User.new (primero: 'Brian', última: 'caso')

user.attributes

{"first" => "brian", "last" => "case"}

user.serializeable_hash

{ "primera" => "Brian", "último" "caso" =>}

+0

Esto solo se aplica a los modelos de Rails (instancias de 'ActiveRecord :: Base'). Para un objeto Ruby arbitrario, la respuesta de @ sufleR funciona. –

Cuestiones relacionadas