在将代码从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中实现以前的行为?
答案 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
的值。