2014-02-14 41 views
0

將代碼從ruby 1.8.6遷移到2.0時,我發現綁定的eval行爲已經改變。我沒有找到任何有關這方面的信息,這些方法的文件沒有改變其措辭。ruby​​ 2.0對binding和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

比較以下,無論是從紅寶石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)看到的行爲。您回來的綁定對象在的位置保留self的值。