我最近了解到,如果该行出现问题,您可以在一行代码上使用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
。
这样做有什么危险吗?我问,因为这看起来好得令人难以置信。我有很多丑陋的代码,我很想摆脱它看起来像第一个代码示例。
答案 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