2013-08-20 48 views
2

我想了解ruby如何處理yield和return語句,並且注意到有時,具有return語句的塊的yield是非法的,但有時可行。我有以下的例子,我在掙扎:帶有返回語句的塊的Ruby收益不一致

def foo 
    yield 
end 

def bar 
    foo do 
    return 'asdf' 
    end 
end 

現在,在上述情況下,我知道下面會失敗:

foo do 
    return 'asdf' 
end 

> LocalJumpError: unexpected return 

但下面的工作(儘管它會返回無,而不是'asdf'):

bar 
=> nil 

我的問題是爲什麼看起來類似的代碼片段反應如此不同?是否因爲返回塊需要一個方法上下文來運行?一個更微妙的情況下

def baz 
    yield 
    puts 'Hi' 
end 

def bif 
    baz do 
    return 'asdf' 
    end 
end 

bif 
=> nil 

的「看跌期權‘你好’後」的產量不會被運行在所有的,我不知道爲什麼。

+0

搜索lambda表達式VS特效 – apneadiving

+0

在你的'foo'例如,第一個做了'return'而不方法或函數裏面。第二個,'bar'裏面有一個有效的'return',因爲它在方法中。在'bif'的情況下,'return'在'puts'之前執行。所以'puts'永遠不會發生。就好像'baz'做了'return'然後'puts'。 – lurker

回答

0

Ruby Proc不能有返回語句。似乎工作的返回語句實際上屬於方法(def ... end)。

關於它的好文章: http://www.robertsosinski.com/2008/12/21/understanding-ruby-blocks-procs-and-lambdas/

+0

這個鏈接其實很不錯。在我目前的情況下總結: 正在執行一個回報的Proc需要有一個上下文返回,這是基於它聲明的地方。另外,ruby中的「block」符號會生成一個Proc,它會在返回時暫停執行。這不同於拉姆達,它會繼續。 – ckcheng