【发布时间】:2014-11-07 23:49:51
【问题描述】:
考虑以下 Ruby 代码:
class Foo
def bar; 42; end
def run(code1,code2)
binding.eval(code1,'c1')
binding.eval(code2,'c2')
end
end
Foo.new.run "x=bar ; p x", "p x"
目的是动态评估某些代码(创建局部变量),然后运行可以访问这些变量的其他代码。结果是:
c2:1:in `run': undefined local variable or method `x' for #<Foo:…> (NameError)
请注意,上述方法仅在 eval 改变绑定时有效,它仅在修改现有局部变量时才有效,而不是创建新变量。我不一定需要(或希望)每次运行都改变外部绑定,我只需要能够访问先前的绑定以进行后续代码评估。
如何评估两个代码块并维护它们之间的局部变量?
出于好奇,这个的实际应用是custom tool,它可以执行一个脚本文件,然后放入一个 REPL。我希望 REPL 能够访问脚本文件创建的所有局部变量。
【问题讨论】:
标签: ruby eval metaprogramming