Ruby eval退出时,eval创建的新实例变量不会停止

Ruby eval退出时,eval创建的新实例变量不会停止,ruby,metaprogramming,eval,Ruby,Metaprogramming,Eval,请注意,eval在临时作用域中计算其代码。eval可以改变 已存在的实例变量。但它定义的任何新实例变量都是局部变量 调用eval并在其返回时停止存在。(这就好像是在评估 代码在块体中运行块的局部变量不存在于 块。) --来自“ruby编程”一书,第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&g

请注意,eval在临时作用域中计算其代码。eval可以改变 已存在的实例变量。但它定义的任何新实例变量都是局部变量 调用eval并在其返回时停止存在。(这就好像是在评估 代码在块体中运行块的局部变量不存在于 块。)

--来自“ruby编程”一书,第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”没有停止,为什么?

我手头没有这本书,但那一定是打字错误。作者所描述的对于Ruby>=1.9中的局部变量是正确的

1.9.3:

irb(main):001:0> eval("a=1")
=> 1
irb(main):002:0> a
NameError: undefined local variable or method `a' for main:Object
    from (irb):2
    from /Users/apple/.rbenv/versions/1.9.3-p385/bin/irb:12:in `<main>'
编辑:这是本书的更多内容,上面写着“局部变量”

>> eval("a=1")
=> 1
>> a
=> 1