Ruby 1.9.3使用eval定义var

时间:2013-01-18 17:19:48

标签: ruby variables eval

我在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中定义变量?

1 个答案:

答案 0 :(得分:3)

IRB is lying to you。这是一个脚本

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'

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