Курс языка программирования Raku / Продвинутый уровень / Операторы / Трейты и прагмы

Встроенные трейты

Типаж применяется с помощью ключевого слова is сразу после объявления. Он выполняется во время компиляции и изменяет некоторое фиксированное свойство того, к чему он прикреплён. В Raku их много; некоторые вы уже использовали.

По умолчанию параметры подпрограммы доступны только для чтения — вы не можете присваивать им значения внутри подпрограммы. Типаж is copy даёт вам приватную, изменяемую копию аргумента, которую можно менять, не затрагивая вызывающую сторону:

sub greet($name is copy) {
    $name = "dear $name";
    say "Hello, $name!";
}

my $who = 'Anna';
greet($who); # Hello, dear Anna!
say $who;    # Anna — the caller's own variable is untouched

Типаж is rw идёт дальше: он привязывает параметр к переменной вызывающей стороны, так что изменение, сделанное внутри подпрограммы, видно снаружи:

sub bump($n is rw) {
    $n++;
}

my $x = 10;
bump($x);
say $x; # 11

Без одного из этих типажей $n++ вызвало бы ошибку компиляции, потому что параметр был бы доступен только для чтения.

Другой распространённый типаж задаёт значение по умолчанию:

my $port is default(8080);
say $port; # 8080

Здесь is default задаёт переменной значение, к которому можно вернуться. Каждый встроенный типаж — is rw, is copy, is default и другие — прикрепляет одно конкретное поведение на этапе компиляции к объявлению. Следующая тема показывает, что типажи — это не закрытый набор: вы можете определить собственные.

Практика

Пройдите 1 тест по содержанию этой темы.

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

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


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