Curso de Raku / Avanzado / Operadores / Traits y pragmas
Escribir un trait
Los traits son subrutinas multi ordinarias con un nombre especial,
por lo que puedes escribir los tuyos. Para agregar un trait que se
escriba is something, define un
multi sub trait_mod:<is> cuyos parámetros indiquen a
qué se aplica y nombren el trait:
Este es uno de los rincones más avanzados de Raku, así que no te preocupes si parece intrincado. Puedes usar los traits incorporados perfectamente bien sin saber cómo están hechos, y rara vez necesitarás escribir uno tú mismo — trata esta página como una mirada bajo el capó.
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]Lee la firma: el primer parámetro, Routine:D $r, es el
elemento al que el trait está asociado — aquí una subrutina. El
:D es un smiley de tipo que exige un valor
definido — un objeto rutina real, no el tipo
Routine vacío e indefinido en sí mismo. (Sus compañeros son
:U, que requiere el objeto de tipo indefinido, y
:_, que acepta cualquiera de los dos.) El parámetro
nombrado :$traced! es el nombre propio del trait; su
presencia es lo que hace que is traced llame a esta sub.
Como los traits se ejecutan en tiempo de compilación,
tanto foo como bar se registran al ser
declarados, así que @traced ya los lista para cuando el
programa se ejecuta — incluso podrías mover la línea
say @traced arriba de las dos definiciones sub
y aún así imprimiría [foo bar].
Este pequeño trait solo registra nombres, pero el mismo mecanismo
puede hacer mucho más: envolver una rutina para agregar registro de
eventos, validar un atributo, o adjuntar metadatos. Escribir el primer
parámetro como un Attribute o Variable en
lugar de un Routine permite que un trait se aplique a
atributos o variables. Los traits son la forma en que Raku mantiene
abierta su sintaxis de declaración — is rw y tu propio
is traced están construidos de la misma manera.
Navegación del curso
← Quiz — Traits | Pragmas →
💪 O ve directamente a los ejercicios de esta
sección.