我在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中定义变量?
答案 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,“编译时”就是“当我得到另一行并且评估它时”这很好