2009-12-16 69 views
2
class Setter 
    attr_accessor :foo 

    def initialize 
     @foo = "It aint easy being cheesy!" 
    end 

    def set 
     self.instance_eval { yield if block_given? } 
    end 
end 

options = Setter.new 

# Works 
options.instance_eval do 
    p foo 
end 

# Fails 
options.set do 
    p foo 
end 

为什么'set'方法失败?Ruby实例评估

编辑

想通了......

def set 
    self.instance_eval { yield if block_given? } 
end 

需要的是:

def set(&blk) 
    instance_eval(&blk) 
end 

回答

2

是的 - 产量在评估范围内定义它的上下文。

好写了here,但一个简单的例子说明这个问题:

>> foo = "wrong foo" 
>> options.set do 
?>  p foo 
>> end 
"wrong foo"