2009-11-18 15 views
38

pago y envío este código y la salidaCómo garantizar obras en rubí

def lab 
    yield 
    ensure 
    puts 'in ensure block' 
    true 
end 

puts lab { puts 'inside inline block'; false } 

output is 
#inside inline block 
#in ensure block 
#false 

que estaba esperando que después se ejecuta el bloque a continuación, asegurar será ejecutado y puesto que asegure el retorno cierto, el resultado final de una llamada al método sería 'cierto'.

Respuesta

62

La asegurar valor de retorno del bloque se descarta - es sólo una manera de limpiar después de la función hace lo que se supone que (y devuelve el valor apropiado). La razón de esto es debido a que le permite poner varios return declaraciones (o raise declaraciones) en diferentes lugares en el cuerpo de la función, sin tener que duplicar el código de limpieza en diferentes lugares de la función.

+17

Wow. Ruby es increíble. – Trip

+2

@trip: alegra que te guste - No es Rubí-específica en absoluto. La mayoría de los lenguajes con manejo de excepción funcionan de la misma manera (por ejemplo, Java, Python). C++ es una excepción a la regla, pero hay algunas cosas incluso más potente que puede hacer con los destructores, como [ScopeGuard] (http://www.drdobbs.com/cpp/184403758). –

-1

Parece como si tuviera que volver explícitamente cierto, ensure podría no devolver el último valor automágicamente.

12

Consulte this blog post para obtener una descripción general de cómo ensure se comporta con devoluciones implícitas y explícitas.

+0

esa es una buena publicación de blog. Pero el autor no mencionó explícitamente que, a menos que se mencione el retorno, los valores de retorno se descartan. – Roger

+0

Gran publicación de blog. Definitivamente vale la pena leer. –

Cuestiones relacionadas