2011-04-20 104 views
3

內「迴歸」關鍵字的人能解釋以下行爲紅寶石塊

def iterate 
    return yield 
    return "end of iterate" 
end 

def test_iterate 
    assert_equal("end of iterate", iterate { return "end of block" }) 
    assert_equal("end of block", iterate { "end of block" }) 
end 

據我所知,特效(這是塊),他們應該被稱爲範圍內返回的行爲。 (與lambda不同)考慮到這一點,測試中的兩個調用都不應該返回「結束塊」?

此測試通過對 '紅寶石1.8.7(2009-06-12 PATCHLEVEL 174)[萬向darwin10.0]'(OSX 10.6.7)

+3

難道這不是意味着,從你的測試功能'return'回報,使其通過,但未達到所有的斷言? – hammar 2011-04-20 16:12:54

+0

確實如此。 '1個測試,0個斷言,0個失敗,0個錯誤' – 2011-04-20 16:25:36

+0

那麼它沒有達到你的第二次調用'iterate' ... – 2011-04-20 16:41:24

回答

4

返回關鍵字從lexicaly包圍返回方法。即* test_iterate *。

要以動態範圍的方式返回塊中的某個值,應該使用中斷關鍵字。

你的情況:

iterate { break("end of block") } 

測試將失敗。因爲迭代方法的第二個return語句永遠不會運行。

預期的語義應該由使用異常來完成:

def iterate 
    return yield 
    rescue :exception 
    return "end of iterate" 
end 

def test_iterate 
    assert_equal("end of iterate", iterate { raise :exception }) 
    assert_equal("end of block", iterate { "end of block" }) 
end 
+0

這是允許測試通過的可接受的方式。答案已被接受。 – 2011-04-25 17:06:58