Курс языка программирования Raku / Продвинутый уровень / Операторы / Трейты и прагмы
Написание трейта
Типажи — это обычные мультиподпрограммы с особым именем, поэтому вы
можете написать собственный. Чтобы добавить типаж, записываемый как
is something, определите
multi sub trait_mod:<is>, параметры которого
указывают, к чему он применяется, и задают имя типажа:
Это один из более сложных уголков Raku, поэтому не беспокойтесь, если покажется запутанным. Вы можете прекрасно использовать встроенные типажи, не зная, как они устроены, и вам редко понадобится писать собственный — считайте эту страницу заглядыванием под капот.
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]Прочтём сигнатуру: первый параметр, Routine:D $r, — это
то, к чему прикреплён типаж, в данном случае подпрограмма.
:D — это типовой смайлик, требующий
определённое значение — настоящий объект подпрограммы,
а не голый, неопределённый тип Routine сам по себе. (Его
партнёры: :U, который требует неопределённый объект типа, и
:_, который принимает оба варианта.) Именованный параметр
:$traced! — это имя самого типажа; именно его наличие
заставляет is traced вызывать эту подпрограмму. Поскольку
типажи выполняются во время компиляции, и
foo, и bar регистрируются при объявлении, так
что @traced уже содержит их к моменту выполнения программы
— вы даже могли бы переместить строку say @traced выше двух
определений sub, и она всё равно напечатала бы
[foo bar].
Этот маленький типаж только записывает имена, но тот же механизм
может делать гораздо больше: оборачивать подпрограмму для добавления
логирования, валидировать атрибут или прикреплять метаданные. Если
записать первый параметр как Attribute или
Variable вместо Routine, типаж можно применять
к атрибутам или переменным. Типажи — это способ, которым Raku сохраняет
открытость синтаксиса объявлений: is rw и ваш собственный
is traced построены одинаково.
Навигация по курсу
← Тест — Трейты | Прагмы →
💪 Или перейдите сразу к упражнениям этого
раздела.