2012-06-11 45 views
4

你能解釋一下嗎?這個評估爲什麼在Ruby中不起作用

我想從兩個不同的來源評估值和計算。一位消息人士給了我以下信息(編程):

'a = 2' 

第二源給了我這句話來評價:

'a + 3' 

這工作:

a = 2 
eval 'a + 3' 

這也適用:

eval 'a = 2; a + 3' 

但是w帽子我真正需要的是這一點,這是行不通的:

eval 'a = 2' 
eval 'a + 3' 

我想理解上的差異,以及如何才能讓最後的選擇工作。

感謝您的幫助。

回答

12

您可以創建一個Binding,並與每個eval調用關聯相同的結合:

1.9.3p194 :008 > b = binding 
=> #<Binding:0x00000100a60c60> 
1.9.3p194 :009 > eval 'a = 2', b 
=> 2 
1.9.3p194 :010 > eval 'a + 3', b 
=> 5 

這樣,您在早些時候eval調用創建的任何變量可後來(只要你使用相同的綁定對象)。

而不是使用Kernel::eval的,你可以使用Binding#eval,這將使聯想更爲清晰:

1.9.3p194 :011 > b = binding 
=> #<Binding:0x00000100b46aa8> 
1.9.3p194 :012 > b.eval 'a = 2' 
=> 2 
1.9.3p194 :013 > b.eval 'a + 3' 
=> 5 
+0

正是我需要的。謝謝。 – Anil

相關問題