2009-12-16 153 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"