Raku-Kurs / Fortgeschritten / Kontrollfluss / Anweisungspräfixe
Laziness und Eagerness
Einige Listen in Raku werden erst berechnet, wenn ihre Elemente
benötigt werden — sie sind lazy. Die Präfixe lazy
und eager ermöglichen es dir, dies explizit zu steuern.
Das eager-Präfix erzwingt, dass eine Liste auf
einmal und sofort erzeugt wird:
my @squares = eager (1..3).map(* ** 2);
say @squares; # [1 4 9]Ohne eager würde das map die Werte trotzdem
erzeugen, aber eager garantiert, dass alle sofort berechnet
werden und nicht erst bei Bedarf.
Das lazy-Präfix bewirkt das Gegenteil: Es markiert eine
Liste als lazy, sodass ihre Elemente erst erzeugt werden, wenn sie
abgerufen werden. Dadurch kann eine Liste konzeptionell unendlich
sein:
my $numbers = lazy (1 .. Inf);
say $numbers.is-lazy; # TrueDie Methode .is-lazy bestätigt, dass die Liste nicht
versuchen wird, alle ihre (endlosen) Elemente im Voraus zu
berechnen.
Dieses spezielle Beispiel ist genau ein Fall, in dem Raku ohnehin
Laziness annehmen würde: Ein unbegrenzter Bereich wie
1 .. Inf ist bereits lazy, daher gibt
say (1 .. Inf).is-lazy auch ohne das Präfix
True aus. Das Schreiben von lazy ändert hier
nichts — es macht die Absicht nur explizit. Das Präfix ist dann
nützlich, wenn du eine Liste lazy machen möchtest, die sonst eager
berechnet würde.
In den meisten Fällen wählt Raku von sich aus vernünftig — Bereiche
und Sequenzen sind lazy, gewöhnliche Array-Zuweisungen sind eager.
Greife auf diese Präfixe zurück, wenn du diese Wahl überschreiben musst:
eager, um eine aufwendige Berechnung sofort zu erzwingen,
lazy, um eine aufzuschieben, die groß oder unbegrenzt sein
könnte.
Kursnavigation
← Quiz — do | sink und quietly →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.