2013-04-05 74 views
0

请注意,eval会在临时范围内评估其代码。 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> 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” 确实停止,为什么呢?

回答

1

我手边没有这本书,但那肯定是一个错字。作者描述的情况对于本地变量在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>' 

1.8.7:

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

编辑:这里的书更recent version和它说: “局部变量”。