Курс по Raku / Напреднали / Оператори / Трейтове и прагми 🆕
Писане на трейт
Трейтовете са обикновени multi-подпрограми със специално име, така че
можете да напишете собствен. За да добавите трейт, записван като
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 са изградени по един и същи начин.
Навигация в курса
← Тест — Трейтове | Прагми →
💪 Или преминете направо към упражненията в този
раздел.