【发布时间】:2012-03-13 15:59:20
【问题描述】:
根据The Ruby Programming Language p.164。
如果
begin语句没有传播异常,则值 语句的最后一个表达式的值在begin、rescue或else子句。
但我发现这种行为与 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 块中发生了什么吗?
【问题讨论】:
-
"为最后执行的语句评估代码块"。这显然是一个错误的假设。
-
抱歉,请使用更具体的陈述和参考进行更正。
-
现在你自己回答了这个问题:“begin, rescue or else”其实是正确的顺序,所以这符合规范。
-
所以您的意思是,规范应该被解释为“在 (order of) begin、rescue 或 else 子句中评估的最后一个表达式的值”?这里说得通。
-
是的,这就是我对那句话的解释。
标签: ruby expression block