Как определяется значение начального блока?

Согласно Языку программирования 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. Это непоследовательное поведение, так как гарантия выполняется последним оператором.

Кто-нибудь может объяснить, что происходит в начальном блоке?

5
задан jtbandes 13 March 2012 в 16:22
поделиться