Курс 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 побудовані
однаково.
Навігація курсом
← Тест — Трейти | Прагми →
💪 Або перейдіть одразу до вправ цього
розділу.