Raku-Kurs / Fortgeschritten / Kontrollfluss

Block-bezogene Phasers

Neben den programmweiten Phasern hat Raku auch Phaser, die an den Lebenszyklus eines einzelnen Blocks oder einer Schleife gebunden sind.

Einen Block betreten und verlassen

Der ENTER-Phaser wird jedes Mal ausgeführt, wenn die Ausführung einen Block betritt, und der LEAVE-Phaser wird jedes Mal ausgeführt, wenn sie ihn verlässt — egal in welcher Zeile sie geschrieben stehen:

say 'before block';
{
    LEAVE say 'leaving';
    ENTER say 'entering';
    say 'inside';
}
say 'after block';

Die Ausgabe zeigt, dass ENTER zuerst und LEAVE zuletzt ausgeführt wird, jeweils um den Rumpf des Blocks herum:

before block
entering
inside
leaving
after block

LEAVE ist besonders nützlich, weil er auch dann ausgeführt wird, wenn der Block vorzeitig verlassen wird, was ihn zu einem zuverlässigen Ort macht, um eine Ressource freizugeben.

Ein Phaser kann einen vollständigen { }-Block anstelle einer einzelnen Anweisung enthalten, und du kannst mehrere davon einrichten. Wenn ein Block mehr als einen LEAVE hat, werden sie in umgekehrter Reihenfolge ausgelöst — der zuletzt registrierte wird zuerst ausgeführt, sodass der Block wie ein Stapel abgebaut wird:

say 'open A';
{
    LEAVE {
        say 'close A';
    }
    say 'open B';
    LEAVE {
        say 'close B';
    }
    say 'work';
}
say 'done';

Ressource A wird zuerst geöffnet und zuletzt geschlossen:

open A
open B
work
close B
close A
done

Diese Last-in-first-out-Reihenfolge ist genau das, was du für Aufräumarbeiten brauchst: Was zuletzt eingerichtet wurde, wird zuerst abgebaut. Der programmweite END-Phaser verhält sich genauso — mehrere END-Blöcke werden ebenfalls in umgekehrter Reihenfolge ihrer Niederschrift ausgeführt.

Schleifen-Phaser

Innerhalb von Schleifen markieren drei weitere Phaser die Phasen der Iteration: FIRST wird einmal vor der ersten Iteration ausgeführt, LAST einmal nach der letzten, und NEXT am Ende jeder Iteration:

for 1..3 {
    FIRST say '-- first';
    LAST  say '-- last';
    NEXT  say "-- next (was $_)";
    say "body $_";
}

Die Schleife erzeugt:

-- first
body 1
-- next (was 1)
body 2
-- next (was 2)
body 3
-- next (was 3)
-- last

Wie bei den anderen Phasern spielt die Position von FIRST, NEXT und LAST im Quelltext keine Rolle — jeder wird zu seinem eigenen Zeitpunkt ausgeführt.

Praxis

Lösen Sie 1 Quiz zum Inhalt dieses Themas.

Übungen

Dieser Abschnitt enthält 3 Übungen. Sehen Sie sich alle Themen dieses Abschnitts an, bevor Sie mit den Übungen beginnen.

  1. Beim Verlassen aufräumen
  2. Einen Block betreten
  3. Nach jedem Schritt

Kursnavigation

Quiz — Phasers   |   Beim Verlassen aufräumen