2012-08-28 38 views
0

是否有任何方式訪問在不同範圍內定義的塊的對象?很抱歉,如果它的混亂,我提供了一個小例子:來自在不同範圍內定義的塊的訪問對象

def scope(&block) 
    foo = "bar" 
    instance_eval &block 
end 

scope do 
    puts "foo is #{foo}" 
end 

我希望得到的輸出:

"foo is bar" 

這可能嗎?

+0

您可以明確地將參數傳遞給塊。 –

+0

是的,我知道,很抱歉,我沒有提前說過。 :(我正在尋找一些方法來做到這一點,而無需傳遞參數到塊。 – evfwcqcg

+0

你究竟想完成什麼? –

回答

2

真正的問題是你想要做什麼,但你可以得到最接近的是這樣的:

def scope 
    @foo = "bar" 
    yield 
end 

scope do 
    puts "foo is #{@foo}" 
end 

注意,使用實例變量@foo,而不是一個局部變量。除非你明確地這樣做,你不能訪問實例變量,就像這樣:

def scope 
    foo = "bar" 
    yield foo 
end 

scope do |foo| 
    puts "foo is #{foo}" 
end 

但是,這是很好的。否則,很難避免與本地變量衝突。

注意:我也已經用明確的&block代替了隱含的yieldyield表格需要存在一個塊,並且語法更簡單,但它主要是風格問題。