1

我正在用 Ruby 编写类似 REPL 的东西,我需要在运行时定义变量。我发现我应该使用 eval,但这里是 irb session 的摘录来测试它。在 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 中定义变量?

4

1 回答 1

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,“编译时”只是“当我得到另一行并评估它时”这很好.

于 2013-01-18T17:55:35.240 回答