У меня есть этот код:
l = lambda { a }
def some_function
a = 1
end
Я просто хочу получить доступ к a
лямбдой и специальной областью, которая в этом примере обозначила a
уже где-то как внутри some_function
, или совсем скоро в той же области, что и:
l = lambda { a }
a = 1
l.call
Затем я обнаружил, что при вызове l
он по-прежнему использует свою собственную привязку, но не новую, где он был вызван.
И затем я попытался использовать его как:
l.instance_eval do
a = 1
call
end
Но это тоже не удалось, странно, что я не могу объяснить, почему.
Я знаю, что одно из решений использует eval
, в котором я мог бы использовать специальную привязку и выполнять некоторый код в тексте, но я действительно не хочу использовать его так.
И я знаю, что он может использовать глобальную переменную или переменную экземпляра. Однако на самом деле мой код находится в более глубокой встроенной среде, поэтому я не хочу разорвать завершенные части, если это не совсем необходимо.
Я передал класс Proc
в документации, и я нашел имена функций binding
, которые относятся к контексту Proc
. Хотя функция предоставила только доступ к ее привязке, но не может ее изменить, кроме использования Binding#eval
. Он также оценивает текст, что я и не люблю делать.
Теперь вопрос в том, есть ли у меня лучший (или более элегантный) способ реализовать это? Или использование eval
уже является обычным способом?
Изменить, чтобы ответить на @Andrew:
Хорошо, это проблема, с которой я столкнулся, когда пишу лексический синтаксический анализатор, в котором я определил массив с фиксированным количеством элементов, включая, как минимум, Proc
и регулярное выражение. Моя цель - сопоставить регулярные выражения и выполнить Procs в моей специальной области, где Proce будет задействовать некоторые локальные переменные, которые должны быть определены позже. И затем я встретил проблему выше.
На самом деле я полагаю, что это не то же самое, что и этот вопрос, поскольку мой - как передать привязку к Proc, а не как его передать.
@Niklas: Получил ваш ответ, я думаю, именно этого я и хочу. Он отлично решил мою проблему.