Попытка ссылаться на хеш, используя строковое значение в Ruby - PullRequest
1 голос
/ 26 мая 2010

Как бы я ссылался на хеш, используя значение строки - т.е.

#!/usr/bin/env ruby
foo = Hash.new
bar = "foo"
"#{bar}"["key"] = "value"

результаты в

 foo:5:in `[]=': string not matched (IndexError)
 from foo:5

Как использовать значение bar (foo) для ссылки на хеш с именем foo? Спасибо!

Ответы [ 3 ]

4 голосов
/ 26 мая 2010
#!/usr/bin/env ruby
foo = Hash.new
bar = "foo"
instance_eval(bar)["key"]="value"

В этом контексте eval(bar) также работает

instance_eval пытается выполнить (как код ruby) строку, которую вы передаете в качестве первого аргумента в текущем контексте.

В вашем примере Ruby пытается вызвать метод String # [] =. И ты не хочешь этого:)

Надеюсь, это поможет.

1 голос
/ 26 мая 2010

Помните, Eval это зло , но это работает:

>> foo = Hash.new
{}
>> bar = "foo"
=> "foo"
>> eval(bar)["key"] = "value"
=> "value"
>> foo
=> {"key"=>"value"}
1 голос
/ 26 мая 2010

Вы можете оценить строку следующим образом: -

foo = Hash.new
bar = "foo"
eval "#{bar}[\"key\"]=\"value\""
puts foo   # {"key"=>"value"}
...