Ruby 1.9.3使用eval定义var

我在Ruby中编写类似REPL的东西,我需要在运行中定义变量。 我想通了我应该使用eval,但这里是从irb会话中摘录来测试它的。 在1.9.3(那将在1.8中工作)

> eval 'a = 3' => 3 > a => NameError: undefined local variable or method `a' for main:Object 

他们将1.9改为:

 > eval 'a = 3' => 3 > eval 'a' => 3 

所以似乎从1.9开始改变它。 如何使用eval(或类似的东西)在1.9.3中定义变量?

IRB骗你 。 这是一个脚本

 eval 'a = 3' puts a 

对于我来说,在1.8.7和1.9.3下失败的方式相同。

不幸的是,你和那个答案提到的等价物,

 eval 'a = 3' eval 'puts a' 

仍然不能在1.9中作为脚本工作,尽管它在1.8中工作。

然而,这对我来说都有用:

 b = binding b.eval 'a = 3' b.eval 'puts a' 

使用相同的绑定意味着变量赋值都发生在同一个上下文中。 你将无法从外部读取它们,因为本地人在编译时被绑定,但是如果你正在编写一个REPL,“编译时”只是“当我得到另一行并且评估它时”这很好。