ruby 2.0更改绑定和eval

时间:2014-02-14 19:47:33

标签: ruby eval ruby-2.0

在将代码从ruby 1.8.6迁移到2.0时,我注意到带有绑定的eval的行为已经改变。我没有找到任何相关信息,这些方法的文档没有改变其措辞。

object = Math
binding = object.__send__(:binding)
puts eval("self", binding)
puts eval("sin(0.2)", binding)

在irb1.8中给出:

> Math
> 0.1986…

和irb2.0:

> main
> NoMethodError

使用新的binding.eval("self")

时我也一样

什么是潜在的变化,我如何在Ruby 2.0中实现以前的行为?

1 个答案:

答案 0 :(得分:0)

比较以下内容,来自Ruby 2.0:

 b = Math.__send__(:binding)
 b.eval("self")
 => main

 b = Math.instance_eval { binding }
 b.eval("self")
 => Math

 # or equivalently...
 b = Math.instance_eval("binding")
 b.eval("self")
 => Math

Kernel#binding的文档说它“描述了调用点的变量和方法绑定”。我认为这准确地描述了您使用Math.__send__(:binding)看到的行为。您获得的Binding对象在呼叫点保留self 的值