Согласно Языку программирования Ruby , стр. 164.
Если оператор
begin
не распространяет исключение, то значение оператора является значением последнего выражения, вычисленного в предложенияbegin
,save
илиelse
.
Но я обнаружил, что это поведение совместимо с begin blockвместе с else itemи гарантировать предложение.
Вот пример кода:
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]
Значение оценивается как предложение else. Это непоследовательное поведение, так как гарантия выполняется последним оператором.
Кто-нибудь может объяснить, что происходит в начальном блоке?