Ruby Oneline Rescue

时间:2013-03-13 21:26:45

标签: ruby rescue

我最近了解到,如果该行出现问题,您可以在一行代码上使用rescue(请参阅http://www.rubyinside.com/21-ruby-tricks-902.html提示#21)。我有一些代码看起来像这样:

if obj['key'] && obj['key']['key2'] && obj['key']['key2']['name']
  name = obj['key']['key2']['name']
else
  name = ''
end

使用rescue方法,我相信我可以将代码更改为以下内容:

name = obj['key']['key2']['name'] rescue ''

如果在访问哈希的任何级别抛出nil异常,它应该被救援抓住并给我'',这就是我想要的。如果这是期望的行为,我还可以选择将名称设置为nil

这样做有什么危险吗?我问,因为这看起来好得令人难以置信。我有很多丑陋的代码,我很想摆脱它看起来像第一个代码示例。

3 个答案:

答案 0 :(得分:11)

读得好!但它会影响你的表现。根据我的经验,rescue在触发时要慢得多,而在没有触发时稍慢。在所有情况下,if都更快。需要考虑的其他事项是,不应该预期异常,并且您可以使用此代码。如此深入嵌套的哈希可能是一个很好的气味,重构是nede

答案 1 :(得分:7)

现在可以使用Ruby 2.3的dig method来实现这个具体的例子。

name = obj.dig 'key', 'key2', 'name'

这将安全地访问obj['key']['key2']['name'],如果任何步骤失败则返回nil。

(一般情况下,通常建议仅将异常用于真实的,未预料到的错误,尽管如果语法使其变得麻烦,在这样的示例中可以理解。)

答案 2 :(得分:-1)

内核::加注可能值得研究

if obj['key']['key2']['name']
  name = obj['key']['key2']['name']
else
  raise ''
end