21

我最近了解到,您可以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如果这是所需的行为,我也可以选择将名称设置为。

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

4

2 回答 2

15

读起来不错!但它会影响你的表现。根据我的经验rescue,触发时速度要慢得多,不触发时速度要慢一些。在所有情况下if都更快。另一件需要考虑的事情是,不应期望出现异常,并且您会使用此代码。拥有如此深嵌套的哈希可能是一种很好的气味,需要重构

于 2013-03-13T21:42:23.250 回答
12

现在可以使用 Ruby 2.3 的dig 方法来实现这个特定的示例。

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

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

(一般来说,通常建议只对真实的、未预料到的错误使用异常,尽管在这样的示例中,如果语法使其变得麻烦,这是可以理解的。)

于 2016-04-15T17:01:37.360 回答