写类似模板引擎的东西,我希望包含的文件将变量添加到基本文件中。事情并没有按预期进行。我对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
的代码访问的变量吗?
答案 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)
由于没有预先定义的本地变量,因此解析器很满意。