2010-02-21 12 views
5

¿Cómo puedo hacer que el siguiente código funcione, para que ambos puts muestren 1?¿Cómo puedo usar una variable como nombre de variable en Ruby?

video = [] 
name = "video" 

name[0] = 1 

puts name[0] #gives me 1 
puts video[0] #gives me nil 
+0

Si realmente tiene que hacerlo, use 'eval()'. Consulte la respuesta a http://stackoverflow.com/questions/2168666/is-it-possible-to-do-dynamic-variables-in-ruby – molf

Respuesta

7

Puede hacer que funcione usando eval:

eval "#{name}[0] = 1" 

que muy encarecidamente que sin embargo. En la mayoría de las situaciones en las que piensas que debes hacer algo como eso, debes usar un hashmap. Me gusta:

context = { "video" => [] } 
name = "video" 
context[name][0] = 1 
+0

@ sepp2k: ¿por qué está en contra de usar eval? – Radek

+3

@Radek: 3000 años de experiencia con sistemas rotos como paperas; este es un olor de código clásico, y hará que su código sea difícil de entender y mantener. –

+3

@Radek: Por un lado, es un gran agujero de seguridad si evalúa la entrada del usuario. Para otros hashmaps son simplemente más adecuados para mapear desde nombres de variables a valores. Para otro más, el código que usa eval puede ser difícil de depurar. – sepp2k

3

Aquí la función eval.

video = [] #there is now a video called array 
name = "video" #there is now a string called name that evaluates to "video" 
puts eval(name) #prints the empty array video 
name[0] = 1 #changes the first char to value 1 (only in 1.8.7, not valid in 1.9.1) 

Aquí está el eval() doc.

Cuestiones relacionadas