Мне интересно, есть ли метод, который позволит мне динамически определять ранее неопределенную переменную в текущем контексте. Например:
foo # => NameError: undefined method or local variable ...
# Some method call which sets foo = 1 in the local context
foo # => 1
Другими словами, учитывая, что foo
не определено, я ищу любой код, который позволил бы мне определить локальную переменную foo
без использования переменной foo
(например, если бы у меня была какая-то другая переменная bar
, значение которой было :foo
, и я должен был полагаться на что установить значение foo
).
Кажется, что eval('foo = 1')
или eval('foo = 1', binding)
или, в Ruby 2.1, binding.local_variable_set(:foo, 1)
эквивалентны:
1.times do
foo = 1
end
другими словами, они устанавливают foo
в контексте нового локального контекста, так что значение недоступно вне этого контекста.
Возможно ли то, что я хочу сделать?
Обновление: этот вопрос не относится к какому-либо конкретному контексту локальной переменной (модуль/класс, метод, процедура, блок и т. д.). Мне было бы интересно точно узнать любой контекст, в котором это можно или нельзя сделать.
define_method(:foo) { 1 }
вариант? - person spickermann   schedule 11.10.2013local_variable_set
и.._get
(так в оригинале), чтобы они соответствовалиinstance_variable_set
и.._get
. - person Cary Swoveland   schedule 12.10.2013Kernel#binding
якобы возвращает текущий контекст, это действительно все, что вам нужно для ссылки на текущий контекст. - person Peter Alfvin   schedule 12.10.2013local_variable_set
, но он ведет себя точно так же, какeval
, согласно ruby-doc.org/core-trunk/ - person Peter Alfvin   schedule 12.10.2013Binding#local_variable_get
и_set
дана в документации ruby-truck для тех, кто методы. - person Cary Swoveland   schedule 12.10.2013