Raku-Kurs / Fortgeschritten / Operatoren / Traits und Pragmas
Einen Trait schreiben
Traits sind gewöhnliche Multi-Subroutinen mit einem speziellen Namen,
sodass Sie Ihre eigenen schreiben können. Um ein Trait mit der
Schreibweise is something hinzuzufügen, definieren Sie ein
multi sub trait_mod:<is>, dessen Parameter angeben,
worauf es sich bezieht, und das Trait benennen:
Dies ist eine der fortgeschritteneren Ecken von Raku, also machen Sie sich keine Sorgen, wenn es kompliziert wirkt. Sie können die eingebauten Traits problemlos verwenden, ohne zu wissen, wie sie aufgebaut sind, und Sie werden selten eines selbst schreiben müssen — betrachten Sie diese Seite als einen Blick unter die Haube.
my @traced;
multi sub trait_mod:<is>(Routine:D $r, :$traced!) {
@traced.push($r.name);
}
sub foo() is traced { }
sub bar() is traced { }
say @traced; # [foo bar]Lesen Sie die Signatur: Der erste Parameter,
Routine:D $r, ist das Element, an das das Trait angehängt
wird — hier eine Subroutine. Das :D ist ein
Typ-Smiley, der einen definierten Wert
verlangt — ein tatsächliches Routine-Objekt, nicht den bloßen,
undefinierten Typ Routine selbst. (Seine Partner sind
:U, das das undefinierte Typ-Objekt erfordert, und
:_, das beides akzeptiert.) Der benannte Parameter
:$traced! ist der eigene Name des Traits; sein
Vorhandensein bewirkt, dass is traced diese Sub aufruft. Da
Traits zur Kompilierzeit ausgeführt werden, sind sowohl
foo als auch bar registriert, sobald sie
deklariert werden, sodass @traced sie bereits auflistet,
wenn das Programm läuft — Sie könnten sogar die Zeile
say @traced über die beiden sub-Definitionen
verschieben, und sie würde trotzdem [foo bar] ausgeben.
Dieses kleine Trait zeichnet nur Namen auf, aber derselbe Mechanismus
kann viel mehr: eine Routine umhüllen, um Protokollierung hinzuzufügen,
ein Attribut validieren oder Metadaten anhängen. Wenn Sie den ersten
Parameter als Attribute oder Variable statt
als Routine schreiben, kann ein Trait auf Attribute oder
Variablen angewendet werden. Traits sind der Weg, wie Raku seine
Deklarationssyntax offen hält — is rw und Ihr eigenes
is traced sind auf dieselbe Weise aufgebaut.
Kursnavigation
← Quiz — Traits | Pragmas →
💪 Oder springen Sie direkt zu den Übungen dieses
Abschnitts.