2010-02-21 5 views
5

Comment faire pour que le code ci-dessous fonctionne, de sorte que les deux puts affichent 1?Comment utiliser une variable comme nom de variable dans Ruby?

video = [] 
name = "video" 

name[0] = 1 

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

Si vraiment vous devez utiliser 'eval()'. Voir la réponse à http://stackoverflow.com/questions/2168666/is-it-possible-to-do-dynamic-variables-in-ruby – molf

Répondre

7

Vous pouvez le faire fonctionner à l'aide eval:

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

Je conseille vivement contre ce bien. Dans la plupart des situations où vous pensez que vous devez faire quelque chose comme ça, vous devriez probablement utiliser un hashmap. Comme:

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

@ sepp2k: pourquoi vous déconseillez fortement d'utiliser eval? – Radek

+3

@Radek: 3000 ans d'expérience avec des systèmes cassés comme les oreillons; c'est une odeur de code classique, et cela rendra votre code difficile à comprendre et à maintenir. –

+3

@Radek: D'une part, c'est un trou de sécurité majeur si vous évaluez l'entrée de l'utilisateur. Pour un autre hashmaps sont simplement plus adapté à la cartographie des noms de variables aux valeurs. Pour encore un autre, le code qui utilise eval peut être difficile à déboguer. – sepp2k

3

Voici la fonction 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) 

Voici la eval() doc.

Questions connexes