2010-02-21 3 views
5

Как я могу сделать код ниже работы, так что оба puts дисплей 1?Как использовать переменную в качестве имени переменной в Ruby?

video = [] 
name = "video" 

name[0] = 1 

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

Если вам действительно нужно, используйте 'eval()'. См. Ответ на http://stackoverflow.com/questions/2168666/is-it-possible-to-do-dynamic-variables-in-ruby – molf

ответ

7

Вы можете сделать его работу с помощью Eval:

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

Я настоятельно советую против этого, хотя. В большинстве ситуаций, когда вы думаете, что вам нужно что-то делать, вы должны probaby использовать хэш-карту. Нравится:

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

@ sepp2k: почему вы категорически против использования eval? – Radek

+3

@ Radek: 3000-летний опыт работы со сломанными системами, такими как свинки; это классический запах кода, и это сделает ваш код трудно понять и сохранить. –

+3

@ Radek: Во-первых, это главное отверстие безопасности, если вы используете пользовательский ввод. Для других hashmaps просто больше подходит для сопоставления имен переменных в значения. Для еще одного кода, который использует eval, может быть больно отлаживать. – sepp2k

3

Здесь функция 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) 

Вот eval() doc.

Смежные вопросы