Курс языка программирования Raku / Продвинутый уровень / Операторы / Трейты и прагмы / Exercises / Пользовательский трейт
Решение: Пользовательский трейт
Вот возможное решение задачи.
Код
my %role;
multi sub trait_mod:<is>(Routine:D $r, :$role!) {
%role{$r.name} = $role;
}
sub login() is role('admin') { }
say %role<login>;🦋 Исходный код можно найти в файле custom-trait.raku.
Вывод
adminКомментарии
Типаж — это
multi sub trait_mod:<is>, именованный параметр которого:$role!активирует его дляis role(...). В отличие от типажа, работающего по наличию, этот получает аргумент:is role('admin')привязывает'admin'к$role.Тело сохраняет это значение под именем подпрограммы. Чтение
%role<login>после этого возвращаетadmin. (Типажи выполняются во время компиляции, поэтому запись уже существует к моменту выполнения программы.)