为什么这个eval在Ruby中不起作用

Ani*_*nil 5 ruby

你能解释一下吗?

我想从两个不同的来源评估值和计算.一个来源给我以下信息(以编程方式):

'a = 2'
Run Code Online (Sandbox Code Playgroud)

第二个来源给我这个表达式来评估:

'a + 3'
Run Code Online (Sandbox Code Playgroud)

这有效:

a = 2
eval 'a + 3'
Run Code Online (Sandbox Code Playgroud)

这也有效:

eval 'a = 2; a + 3'
Run Code Online (Sandbox Code Playgroud)

但我真正需要的是这个,它不起作用:

eval 'a = 2'
eval 'a + 3'
Run Code Online (Sandbox Code Playgroud)

我想了解其中的差异,以及如何使最后一个选项有效.

谢谢你的帮助.

mat*_*att 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 
Run Code Online (Sandbox Code Playgroud)

这样,您在先前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 
Run Code Online (Sandbox Code Playgroud)