eval はそのコードを一時的なスコープで評価することに注意してください。eval は、すでに存在するインスタンス変数の値を変更できます。しかし、それが定義する新しいインスタンス変数はすべて eval の呼び出しに対してローカルであり、それが戻ると存在しなくなります。(評価されたコードがブロックの本体で実行されるかのようです。ブロックに対してローカルな変数は、ブロックの外には存在しません。)
-- 「ルビー プログラミング」の本の8.3.1章より
irb(main):001:0> class Point
irb(main):002:1> def initialize(x,y)
irb(main):003:2> @x,@y=x,y
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> p=Point.new(1,2)
=> #
irb(main):007:0>
irb(main):008:0* def get_bind
irb(main):009:1> binding
irb(main):010:1> end
=> nil
irb(main):011:0> b=p.get_bind
=> #Binding:0x81915b0
irb(main):012:0>
irb(main):013:0* eval("@x",b)
=> 1
irb(main):014:0>
irb(main):015:0* eval("@x=10",b)
=> 10
irb(main):016:0> eval("@x",b)
=> 10
irb(main):017:0>
irb(main):018:0* eval("@z=2",b)
=> 2
irb(main):019:0> eval("@z",b)
=> 2
irb(main):020:0> p.instance_variables
=> [:@x, :@y, :@z]
irb(main):021:0>
irb(main):022:0*
irb(main):023:0*
インスタンス変数 "@z" が止まらないのはなぜですか?