gpt4 book ai didi

ruby - begin block 的值是如何确定的?

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

根据 The Ruby Programming Language第 164 页。

If a begin statement doesn't propagate an exception, then the value of the statement is the value of the last expression evaluated in the begin, rescue or else clauses.

但我发现这种行为与 begin block 以及 else 子句ensure 子句 一致。

示例代码如下:

def fact (n)
raise "bad argument" if n.to_i < 1
end

value = begin
fact (1)
rescue RuntimeError => e
p e.message
else
p "I am in the else statement"
ensure
p "I will be always executed"
p "The END of begin block"
end

p value

输出是:

"I am in the else statement"
"I will be always executed"
"The END of begin block"
"I am in the else statement"
[Finished]

value 被评估为 else 子句。这是不一致的行为,因为 ensure 子句 是最后执行的语句。

谁能解释一下 begin block 中发生了什么?

最佳答案

我会将 begin/rescue/else/end block 的目标解释为:

  • 执行begin部分的代码,然后执行else部分的代码。
  • 如果 begin 部分出现问题,则执行 rescue 部分而不是 else 部分。

因此要么 rescue 部分或else 部分将在尝试begin 部分后执行;因此,其中一个将用作整个 block 的值是有道理的。

这只是一个副作用,确保部分将始终被执行。

val = begin
p "first"; "first"
rescue => e
p "fail"; "fail"
else
p "else"; "else"
ensure
p "ensure"; "ensure"
end

val # => "else"
# >> "first"
# >> "else"
# >> "ensure"

但是:

val = begin
p "first"; "first"
raise
rescue => e
p "fail"; "fail"
else
p "else"; "else"
ensure
p "ensure"; "ensure"
end

val # => "fail"
# >> "first"
# >> "fail"
# >> "ensure"

关于ruby - begin block 的值是如何确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687579/

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