Corso di Raku / Avanzato / Operatori / Trait e pragma
Scrivere un trait
I trait sono normali multi-subroutine con un nome speciale, quindi
puoi scrivere i tuoi. Per aggiungere un trait scritto
is something, definisci una
multi sub trait_mod:<is> i cui parametri specificano
a cosa si applica e il nome del trait:
Questo è uno degli aspetti più avanzati di Raku, quindi non preoccuparti se ti sembra complesso. Puoi usare perfettamente i trait integrati senza sapere come sono realizzati, e raramente avrai bisogno di scriverne uno tu stesso — considera questa pagina come uno sguardo sotto il cofano.
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]Leggi la firma: il primo parametro, Routine:D $r, è
l’elemento a cui il trait è associato — qui una subroutine. Il
:D è uno smiley di tipo che richiede un valore
definito — un oggetto routine reale, non il tipo
Routine indefinito. (I suoi compagni sono :U,
che richiede l’oggetto tipo indefinito, e :_, che accetta
entrambi.) Il parametro nominato :$traced! è il nome del
trait stesso; la sua presenza è ciò che fa sì che is traced
chiami questa sub. Poiché i trait vengono eseguiti al momento
della compilazione, sia foo che bar
vengono registrati al momento della dichiarazione, quindi
@traced li elenca già quando il programma viene eseguito —
potresti persino spostare la riga say @traced sopra le due
definizioni sub e stamperebbe comunque
[foo bar].
Questo piccolo trait registra solo i nomi, ma lo stesso meccanismo
può fare molto di più: avvolgere una routine per aggiungere logging,
validare un attributo o associare metadati. Scrivendo il primo parametro
come Attribute o Variable invece di
Routine, un trait può applicarsi ad attributi o variabili.
I trait sono il modo in cui Raku mantiene aperta la sintassi delle
dichiarazioni — is rw e il tuo is traced sono
costruiti allo stesso modo.
Navigazione del corso
← Quiz — Trait | Pragma →
💪 Oppure vai direttamente agli esercizi di questa
sezione.