Cursus Raku / Geavanceerd / Operatoren / Traits en pragma’s
Een trait schrijven
Traits zijn gewone multi-subroutines met een speciale naam, dus je
kunt er zelf een schrijven. Om een trait toe te voegen die je als
is something schrijft, definieer je een
multi sub trait_mod:<is> waarvan de parameters zeggen
waarop hij van toepassing is en hoe de trait heet:
Dit is een van de meer gevorderde hoekjes van Raku, dus geen zorgen als het ingewikkeld aanvoelt. Je kunt de ingebouwde traits prima gebruiken zonder te weten hoe ze gemaakt zijn, en je zult er zelden zelf een hoeven schrijven — beschouw deze pagina als een blik onder de motorkap.
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]Lees de signatuur: de eerste parameter, Routine:D $r, is
datgene waaraan de trait hangt — hier een subroutine. De :D
is een type-smiley die een gedefinieerde
waarde eist — een echt routineobject, niet het kale, ongedefinieerde
type Routine zelf. (Zijn partners zijn :U, die
het ongedefinieerde typeobject vereist, en :_, die beide
accepteert.) De benoemde parameter :$traced! is de naam van
de trait zelf; zijn aanwezigheid is wat is traced deze sub
laat aanroepen. Omdat traits tijdens het compileren
draaien, worden zowel foo als bar
geregistreerd zodra ze gedeclareerd worden, zodat @traced
ze al bevat tegen de tijd dat het programma draait — je zou de regel
say @traced zelfs boven de twee sub-definities
kunnen zetten en hij zou nog steeds [foo bar]
afdrukken.
Deze piepkleine trait legt alleen namen vast, maar hetzelfde
mechanisme kan veel meer: een routine omwikkelen om logging toe te
voegen, een attribuut valideren of metadata aanhangen. Door de eerste
parameter als Attribute of Variable te
schrijven in plaats van als Routine, laat je een trait op
attributen of variabelen werken. Traits zijn de manier waarop Raku zijn
declaratiesyntaxis open houdt — is rw en je eigen
is traced zijn op dezelfde manier gebouwd.
Cursusnavigatie
← Quiz — Traits | Pragma’s →
💪 Of ga direct naar de oefeningen in deze
sectie.