在代码的eval之间维护局部变量

考虑以下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 ; px", "px" 

目的是动态评估一些代码 – 它创建局部变量 – 然后运行可以访问这些变量的其他代码。 结果是:

 c2:1:in `run': undefined local variable or method `x' for # (NameError) 

请注意,上述内容仅在eval突变绑定时才有效,只有在修改现有局部变量时才会这样做,而不会创建新变量。 我不一定需要(或想要)每次运行来改变外部绑定,我只需要能够访问先前的绑定以进行后续的代码评估。

我如何评估两个代码块并在它们之间维护局部变量?


对于好奇的,这个实际应用程序是一个自定义工具 ,可以执行脚本文件,然后放入REPL。 我希望REPL能够访问脚本文件创建的所有局部变量。

您需要存储Binding并重新使用相同的Binding 。 如果您反复调用binding – 即使在相同的范围内 – 您将获得新的绑定。 因此,对于演示function,我们可以这样做:

 class Foo def initialize; @b = binding; end def bar; 42; end def run(code) @b.eval( code, '(yourcode)' ) end end f = Foo.new f.run "x=bar ; px" #=> 42 f.run "px" #=> 42