5

これを説明できますか?

2 つの異なるソースからの値と計算を評価したいと考えています。ある情報源は、次の情報を(プログラムで)提供してくれます:

'a = 2'

2 番目の情報源は、評価する次の式を示しています。

'a + 3'

これは機能します:

a = 2
eval 'a + 3'

これも機能します:

eval 'a = 2; a + 3'

しかし、私が本当に必要としているのはこれであり、うまくいきません:

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

違いを理解したいのですが、最後のオプションを機能させるにはどうすればよいですか。

ご協力いただきありがとうございます。

4

1 に答える 1

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 
于 2012-06-11T04:51:13.533 に答える