2010-05-04 62 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返回一个对象,无论发送什么消息,它都会返回零。对于其他对象,它返回原始对象。几乎任何事情都比用例外来解决问题更有效率。

相关问题