gpt4 book ai didi

ruby - 异常 : why does adding parenthesis change anything?

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:50 25 4
gpt4 key购买 nike

关于 Ruby 如何处理内联错误处理程序,我想了解一些事情

案例一

这是一个常见的用例

def foo
raise Error
end

bar = foo rescue 1
# => 1
bar
# => 1

它按预期工作。表达式 foo rescue 1 返回 1 并正确分配给 bar

案例二

Ruby 允许解构数组,所以这种行为看起来很奇怪。

baz = 'a'
baz, bar = foo rescue [1, 2]
# => [1, 2]
baz
# => 'a'
bar
# => nil

表达式返回数组 [1, 2] 但不解构或分配它。它完全跳过了分配。

案例三

但是,当您将错误括在括号中时,解构就起作用了。

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:

显然有些人认为这不是问题,所以标题可能不够明显。这是全文的问题:

为什么会发生这些不一致,为什么添加括号会改变一切?

最佳答案

您的情况 2 与此相同:

baz = 'a'
(baz, bar = foo) rescue [1, 2]

由于 foo 引发错误,将值分配给 bazbar 失败,因此 baz 仍然为是 "a",而 bar 仍然是 nil,这是一个在解析阶段分配的值。然后,赋值被拯救,返回值将是 [1, 2]

您的情况 4 与此相同:

(baz = raise Error) rescue 1

由于赋值的右侧引发错误,对 baz 的赋值失败,baz 将保持为 nil,即在解析阶段分配。然后,赋值被拯救,返回值为1

关于ruby - 异常 : why does adding parenthesis change anything?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com