2010-03-27 21 views
18

Estoy empezando a aprender Ruby y he escrito un programa que genera algunos números y los asigna a variables @one, @two, @three, etc. El usuario puede especificar una variable para cambiar ingresando su nombre (por ejemplo, uno). Entonces necesito hacer algo como '@ [valueofinout] = asd'. ¿Cómo lo haría? ¿Hay alguna manera mejor de desanimar la manera en que estoy pensando? He encontradoUsando el valor de una variable como otro nombre de variable en Ruby

x = "myvar" 
myvar = "hi" 
eval(x) -> "hi" 

pero no entiendo completamente por qué es necesaria la segunda línea. En mi caso voy a usar algo como

@one = "21" 
input = "one" 
input = "@" + input 
changeto = "22" 
eval(input) -> changeto 

Respuesta

28

Uso instance_variable_set (rubydoc)

instance_variable_set("@" + varname, value) 

En la mayoría de los casos, sin embargo, se debe separar sus variables normales de rubíes de las variables que su usuario está interactuando. ¿Qué hay de la creación de un hash de variables de usuario, p.

@uservars = { 'one' => 1, 'two' => 2 } 
two = @uservars['two'] # Look up 'two' variable 

varname = "myvar" 
@uservars[varname] = 5 # Set a variable by name 
value = @uservars[varname] # Get a variable by name 
+1

guau, esta es en realidad un área donde PHP eclipsa ruby ​​en términos de limpieza de sintaxis. http://stackoverflow.com/a/4169891/2951835 – ahnbizcad

+0

Ruby hace que sea difícil de hacer porque es feo, rara vez es necesario configurar una variable especificada por el usuario de una instancia a menos que esté metaprogramando. Moverse dinámicamente con variables globales es un agujero de seguridad; si desea un conjunto de variables definidas por el usuario, probablemente desee un hash. – rjh

2

Las variables de instancia pueden ser recuperados a través de este método:

input = instance_variable_get("@one") 

Después de esto, en su caso, usted tiene input igual a "21".

+0

Hola, no estoy del todo seguro de si eso funcionaría para lo que necesito. Tendría que tener algo que asignara un cierto número a una variable (digamos la variable A) pero el nombre de la variable A no se conoce. El nombre de la variable A se almacena dentro de la variable B, así que necesitaría usar el valor de la variable B para asignar algo a la variable A. AFAICT esto no se puede hacer con instance_variable_get. – hrickards

+0

@hrickards: ¿Conoces los valores posibles de A? si lo haces, hay otra forma. ¡Pero intance_variable_get debería hacer lo que quieras! –

+0

@Niklaos Un número entero que incluye 1 y 49 – hrickards

Cuestiones relacionadas