Ruby Oneline Rescue

Jim*_*y Z 16 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
Run Code Online (Sandbox Code Playgroud)

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

name = obj['key']['key2']['name'] rescue ''
Run Code Online (Sandbox Code Playgroud)

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

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

Leo*_*lán 11

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


mah*_*off 7

现在可以使用Ruby 2.3的dig方法实现这个具体的例子.

name = obj.dig 'key', 'key2', 'name'
Run Code Online (Sandbox Code Playgroud)

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

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