我最近了解到,如果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
现在可以使用Ruby 2.3的dig方法实现这个具体的例子.
name = obj.dig 'key', 'key2', 'name'
Run Code Online (Sandbox Code Playgroud)
这将安全访问obj['key']['key2']['name'],如果任何步骤失败则返回nil.
(一般情况下,通常建议仅将异常用于真实的,未预料到的错误,尽管如果语法使得它很麻烦,在这样的例子中它是可以理解的.)
| 归档时间: |
|
| 查看次数: |
7177 次 |
| 最近记录: |