2014-04-24 47 views
2

我具有限定的方法,logged,這將前綴添加到不同的方法的結果,say一個模塊:如何在塊中調用一個方法來查看調用函數上下文中設置的變量?

module M 
    def logged(&block) 
    str = "logged: " 
    block.call 
    end 

    def say(value) 
    puts str + value 
    end 
end 

我想能夠使用M的體內class塊,像這樣:

class C 
    extend M 

    logged { 
    say "one" 
    say "two" 
    } 
end 

,並得到:

# => "logged: one" 
# => "logged: two" 

居本質上,我想要say能夠訪問僅在logged的調用上下文中的logged中的值。所以,我寧願避免實例變量,全局變量等等。

什麼是正確的方法來解決這個問題?

回答

3

下面是做到這一點的一種方法: -

module M 
    def logged(&block) 
    str = "logged: " 
    block.call(str) 
    end 

    def say(str, value) 
    puts str + value 
    end 
end 

class C 
    extend M 

    logged { |s| 
    say s, "one" 
    say s, "two" 
    } 
end 
+1

尼斯之一,奧雅納。可能值得一提的是,由於'logged'是在類上調用的,它和'say'必須是類方法,這就是爲什麼你使用'extend'的原因。 –

+0

@CarySwoveland +1 ..謝謝指出。 –

+0

這並不是我所追求的,因爲我希望能夠通過它在呼叫站點獲得'str' - 這樣做並不是很乾燥,如果你有很多'說'方法。但我想這是行不通的。謝謝! –

相關問題