De acuerdo con The Ruby Programming Language p.164.¿Cómo se determina el valor de un bloque begin?
Si una declaración
begin
no se propaga a una excepción, entonces el valor de la declaración es el valor de la última expresión evaluada en losbegin
,rescue
oelse
cláusulas.
Pero encontré este comportamiento consistente con la comienzan bloque junto con cláusula else y garantizar cláusula.
Aquí es el código de ejemplo:
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
La salida es:
"I am in the else statement"
"I will be always executed"
"The END of begin block"
"I am in the else statement"
[Finished]
El value
se evalúa a la cláusula else. Este es un comportamiento incoherente ya que asegura la cláusula es la última instrucción ejecutada.
¿Podría alguien explicar lo que está sucediendo dentro del bloque de comenzar?
"bloque de código se evalúa para la última sentencia ejecutada". Esta es obviamente una suposición equivocada. –
Disculpe, corrija con declaraciones y referencias más específicas. – steveyang
Ahora usted mismo ha respondido a la pregunta: "begin, rescue or else" es, de hecho, el orden correcto, por lo que esto es coherente con la especificación. –