1

私はRubyでREPLのようなものを書いていますが、実行時に変数を定義する必要があります。evalを使用する必要があることがわかりましたが、これはirbセッションからの抜粋です。1.9.3では(1.8で機能します)

> eval 'a = 3'
=> 3
> a
=> NameError: undefined local variable or method `a' for main:Object

彼らは1.9でそれを次のように変更しました:

> eval 'a = 3'
=> 3 
> eval 'a'
=> 3

1.9から変更したようです。eval(または同様のもの)を使用して1.9.3で変数を定義するにはどうすればよいですか?

4

1 に答える 1

3

IRBはあなたに嘘をついています。これはスクリプトとして:

eval 'a = 3'
puts a

私にとっては1.8.7と1.9.3で同じように失敗します。

残念ながら、あなたとその回答の両方で言及されている同等のものは、

eval 'a = 3'
eval 'puts a'

1.8では機能しますが、1.9ではスクリプトとしては機能しません。

ただし、これは両方で機能します。

b = binding
b.eval 'a = 3'
b.eval 'puts a'

同じバインディングを使用するということは、変数の割り当てがすべて同じコンテキストで行われることを意味します。ローカルはコンパイル時にバインドされるため、外部から読み取ることはできませんが、REPLを作成する場合、「コンパイル時」は「別の行を取得して評価するとき」であり、問​​題ありません。 。

于 2013-01-18T17:55:35.240 に答える