2010-02-21 11 views
5

Come posso far funzionare il codice qui sotto, in modo che sia puts visualizzare 1?Come posso usare una variabile come nome di variabile in Ruby?

video = [] 
name = "video" 

name[0] = 1 

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

Se proprio devi, usa 'eval()'. Vedere la risposta a http://stackoverflow.com/questions/2168666/is-it-possibile-da-do-dinamica-variabile-in-ruby – molf

risposta

7

È possibile farlo funzionare utilizzando eval:

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

mi consiglia vivamente contro questo però. Nella maggior parte dei casi in cui pensi di dover fare qualcosa del genere, dovresti usare una hashmap. Come:

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

@ sepp2k: perché sei fortemente contrario all'uso di eval? – Radek

+3

@Radek: 3000 anni di esperienza con sistemi rotti come la parotite; questo è un classico odore di codice e renderà il tuo codice difficile da capire e da mantenere. –

+3

@Radek: Per prima cosa, è un grosso buco di sicurezza se si evalano gli input dell'utente. Perché un'altra hashmap è semplicemente più adatta per mappare da nomi di variabili a valori. Per l'ennesimo, il codice che utilizza eval può essere un problema per il debug. – sepp2k

3

Qui la funzione 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) 

Ecco lo eval() doc.

Problemi correlati