在ruby中有begin ... rescue ... end(异常块)的功能版本吗?

时间:2010-05-04 21:26:36

标签: ruby exception functional-programming

我想在ruby中做这样的事情:

safe_variable = begin
  potentially_nil_variable.foo
rescue
  some_other_safe_value
end

...并将异常块(begin / rescue / end)视为函数/块。这不是书面形式的,但有没有办法得到类似的结果?

注意我实际上在做的是这个,但有效但IMO难看:

begin
  safe_variable = potentially_nil_variable.foo
rescue
  safe_variable = some_other_safe_value
end

更新

我想我在ruby语法上遇到了一个问题。我实际上在做的是:

object_safe = begin potentially_nil_variable.foo
rescue ""
end

错误为class or module required for rescue clause。可能它认为""应该是异常结果的占位符。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我知道用于向可能为nil的对象发送消息的最有用的方法类似于andand。对于nil,andand返回一个对象,无论您发送什么消息,该对象都将返回nil。对于其他对象,它返回原始对象。而且几乎任何事情都会比通过例外处理更有效率。