2009-11-18 4 views
38

Kasse dieses Code gewährleisten und die AusgabeWie funktioniert in Ruby

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 

Ich habe erwartet, dass nach dem Block dann ausgeführt wird, ausgeführt wird, sicherzustellen, und gibt true zurück, würde die endgültige Ausgabe die Methode des Aufrufs sicherzustellen, da sein 'wahr'.

Antwort

62

Der Rückgabewert des Sicherstellungsblocks wird verworfen - es ist nur eine Möglichkeit, aufzuräumen, nachdem die Funktion ausgeführt hat, was immer sie auch tun soll (und den entsprechenden Wert zurückgibt). Der Grund dafür ist, dass Sie mehrere return-Anweisungen (oder raise-Anweisungen) an verschiedenen Stellen im Funktionskörper einfügen können, ohne den Bereinigungscode an verschiedenen Stellen in der Funktion duplizieren zu müssen.

+17

Wow. Ruby ist großartig. – Trip

+2

@Trip: froh, dass es Ihnen gefällt - es ist überhaupt nicht rubinspezifisch. Die meisten Sprachen mit Ausnahmebehandlung funktionieren auf die gleiche Weise (z. B. Java, Python). C++ ist eine Ausnahme von der Regel, aber es gibt noch mächtigere Dinge, die Sie mit Destruktoren machen können, wie zum Beispiel [ScopeGuard] (http://www.drdobbs.com/cpp/184403758). –

-1

Scheint so, als müssten Sie explizit "True" zurückgeben, ensure könnte den letzten Wert nicht automatisch zurückgeben.

12

Siehe this blog post für einen Überblick darüber, wie sich ensure sowohl mit impliziten als auch mit expliziten Rückgaben verhält.

+0

das ist ein guter Blogbeitrag. Aber der Autor hat nicht ausdrücklich erwähnt, dass Rückgabewerte verworfen werden, wenn Rückkehr nicht erwähnt wird. – Roger

+0

Toller Blogbeitrag. Auf jeden Fall eine Lektüre wert. –

Verwandte Themen