关于 Ruby 如何处理内联错误处理程序,我想了解一些事情
情况1
这是一个常见的用例
def foo
raise Error
end
bar = foo rescue 1
# => 1
bar
# => 1
它按预期工作。表达式foo rescue 1
返回1
并正确分配给bar
.
案例2
Ruby 允许解构数组,所以这种行为看起来很奇怪。
baz = 'a'
baz, bar = foo rescue [1, 2]
# => [1, 2]
baz
# => 'a'
bar
# => nil
该表达式返回数组[1, 2]
,但不解构或分配它。它完全跳过了分配。
案例3
但是,当您将错误括在括号中时,解构就会起作用。
baz, bar = (foo rescue [1, 2])
# => [1, 2]
baz
# => 1
bar
# => 2
案例4
加分项:引发错误并尝试内联处理它也会跳过分配
baz = raise Error rescue 1
# => 1
baz
# => nil
但是添加括号使它起作用。
编辑:
我在 Ruby 1.9.3-p392 和 Ruby 2.0.0 上对此进行了测试
编辑 2:
我为案例添加了标签
编辑 3:
显然有些人认为这不是一个问题,所以也许标题不够明显。这是全文的问题:
为什么会发生这些不一致,为什么添加括号会改变什么?