Курс языка программирования 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 построены одинаково.

Навигация по курсу

Тест — Трейты   |   Прагмы


💪 Или перейдите сразу к упражнениям этого раздела.