如何执行具有相同绑定的嵌套eval?

时间:2018-12-21 14:02:25

标签: ruby

写类似模板引擎的东西,我希望包含的文件将变量添加到基本文件中。事情并没有按预期进行。我对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 :(得分:3)

整个'eval("ddd=1", b); ddd'就像下面这样进入红宝石解析器:

some_func(...)
ddd

不知道some_func可以定义局部变量并像上面的代码一样引发NameError

下面的代码将起作用:

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

由于没有预先定义的本地变量,因此解析器很满意。