Я пытаюсь установить локальную переменную для существующего связыванияИнъекционное локальную переменную для привязки
def foo_callback
lambda { |name| p name }
end
b = foo_callback.binding
Связывание не имеет каких-либо локальных переменных, начинающиеся с:
b.eval("local_variables") # => []
Пусть поставим примитивную локальную переменную для связывания:
b.eval("age=30")
Все работает, как ожидалось:
b.eval("local_variables") # => ["age"]
b.eval("age") # => 30
Теперь давайте попробуем установить непримитивный локальную переменную для связывания:
country = Country.first
b.eval("lambda {|v| country = v}").call(country)
Примечание:technique для установки переменной заимствовано из facet
камень. Я попробовал ruby 1.9 safe implementation с такими же результатами.
Связывание не отражает местную переменную country
.
b.eval("local_variables") # => ["age"]
Как мне обойти эту проблему? По сути, я хочу объявить новую переменную в привязке, используя значение существующей, не примитивной переменной.
Я на рубине 1.8.7.
связывания() является частным, поэтому никогда связывание не может называться так: 'б = foo_callback.binding' – 7stud
@ 7stud Вы можете. Запустите код в рубиновой консоли 'def foo_callback lambda {| name | p name} end b = foo_callback.binding' –