Aus Schleifen ausbrechen

Du bist hier: Hinterkattentuffel - Ruby - Aus Schleifen ausbrechen
Prev: Anonym und dynamisch: Blöcke

Es gibt eine Reihe von Möglichkeiten, aus einem Block heraus den aufrufenden Programmfluß zu beeinflussen. Die Standard-Variante ist ein break. Damit springt man aus der Methode, die den Block aufruft. Noch weiter springt man mit einem in den Block codierten return oder einer Exception.

Wer einen Block aufruft, muss also damit rechnen, dass der Code nach dem Block nicht mehr erreicht wird. Es gibt jedoch einen Mechanismus, um Aufräumarbeiten unterzubringen:

begin
  aCollection.each do
    block.call
  end
ensure
  [...]
end

Der Teil im ensure wird auf jeden Fall aufgerufen, egal, was in block.call passiert. Ausgenommen sind lediglich Systemabbrüche, oder -abstürze.

Das Programm break.rb.txt zeigt die drei Varianten, aus einer Schleife auszubrechen. In test1 wird break verwendet, test2 verwendet ein return. Für test3 wird zunächst eine neue Exception als Unterklasse von StandardError definiert. Diese wird mit raise geschmissen und mit rescue gefangen.

Hier die Ausgabe des Programms:

CMD> ruby break.rb
test 1, Iteration 1: Vor block.call
test 1, Iteration 1: Nach block.call
test 1, Iteration 2: Vor block.call
test 1: In ensure
test 1: end
test 2, Iteration 1: Vor block.call
test 2, Iteration 1: Nach block.call
test 2, Iteration 2: Vor block.call
test 2: In ensure
test 3, Iteration 1: Vor block.call
test 3, Iteration 1: Nach block.call
test 3, Iteration 2: Vor block.call
test 3: In ensure
test 3: rescue LoopInterrupt
test 3: end

Wie man sieht, wird das ensure in allen drei Tests durchlaufen. Das return verlässt sowohl den Block als auch die Methode test2. Mit der Exception LoopInterrupt könnte man sogar noch weiter "springen". Ohne ein entsprechendes rescue würde sogar das Programm abbgebrochen.

Next: RubyGems, der Ruby Paketmanager