Как выполнить вложенный eval с такой же привязкой? - PullRequest
0 голосов
/ 21 декабря 2018

Написание чего-то похожего на шаблонизатор, и я хотел бы включить файлы для добавления переменных в базовый файлВещи не работают, как ожидалось, хотя.Мои наблюдения eval таковы:

[23] pry(main)> b = binding
=> #<Binding:0x000055ca9d13ad68>
[24] pry(main)> eval('eval("ddd=1", b); ddd', b)
NameError: undefined local variable or method `ddd' for main:Object
from (pry):1:in `__pry__'
[25] pry(main)> eval('eval("ddd=1", b); ddd', b)
=> 1

Почему первый вызов не удался?Я ожидал, что вложенный eval установит переменную в привязке, и тогда она будет видна снаружи.На самом деле это видно в привязке только после.

Любой совет, как разрешить вложенным eval устанавливать переменные, доступные из кода внешнего eval?

1 Ответ

0 голосов
/ 21 декабря 2018

Целое 'eval("ddd=1", b); ddd' доходит до синтаксического анализатора ruby ​​примерно так:

some_func(...)
ddd

Он не знает, что some_func может определять локальную переменную и вызывает NameError точно так же, как и код выше.

Код, приведенный ниже, будет работать:

b = binding
eval('eval("ddd=1", b); b.local_variable_get(:ddd)', b)

Здесь синтаксический анализатор удовлетворен, так как нет заранее определенных локальных элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...