2010-05-04 15 views
0

我想這樣做的紅寶石:在ruby中是否有begin ... rescue ... end(異常塊)的功能版本?

safe_variable = begin 
    potentially_nil_variable.foo 
rescue 
    some_other_safe_value 
end 

...和處理異常塊(開始/救援/側)作爲功能/塊。這不符合書面規定,但有沒有辦法得到類似的結果?

NB什麼我實際上做的是這樣的,它的工作原理,但IMO醜:

begin 
    safe_variable = potentially_nil_variable.foo 
rescue 
    safe_variable = some_other_safe_value 
end 

UPDATE

我想我打的Ruby語法一個角落的情況。我實際上做的是這樣的:

object_safe = begin potentially_nil_variable.foo 
rescue "" 
end 

錯誤是class or module required for rescue clause。可能它認爲""應該是異常結果的佔位符。

+0

你的第一個例子應該工作作爲書面,其實 - 你得到什麼錯誤? – 2010-05-04 21:31:38

+0

奇怪的是,功能版本似乎沒有出現在任何地方的紅寶石文檔。 – 2010-05-04 21:52:44

回答

6

你擁有的形式應該工作:

safe_variable = begin 
    potentially_nil_variable.foo 
rescue 
    some_other_safe_value 
end 

較短的形式:

safe_variable = this_might_raise rescue some_other_safe_value 

如果你只是避免nil,你可以看看的ActiveRecord的try

safe_variable = potentially_nil_variable.try(:foo) || some_other_safe_value 
0

我知道發送消息給對象的功能最強的方法可能是零就像andand。對於零,andand返回一個對象,無論發送什麼消息,它都會返回零。對於其他對象,它返回原始對象。幾乎任何事情都比用例外來解決問題更有效率。

相關問題