Открыть список
Как стать автором
Обновить

Особенности (traits) в Perl 6 – метаданные вместе с символом

PerlПрограммирование
Перевод
Автор оригинала: Moritz
Особенности (Traits) – это удобный и расширяемый способ присоединения метаданных к различным видам объектов в Perl 6. Рассмотрим пример особенности с is cached, автоматически кеширующей возвращаемое функцией значение в зависимости от переданных аргументов.

# следующий код вызывается, когда к функции
# добавляется 'is cached' 
multi sub trait_mod:<is>(Routine $r, :$cached!) {
     my %cache;
     # обернём функцию в блок, который
     $r.wrap(-> $arg {
         # ищет аргумент в кеше
         %cache{$arg}:exists
             ?? %cache{$arg}
             # ... и вызывает оригинал, если он не найден
             !! (%cache{$arg} = callwith($arg))
         }
     );
 }
 
 # пример применения:
 sub fib($x) is cached {
     say("fib($x)");
     $x <= 1 ?? 1 !! fib($x - 1) + fib($x - 2);
 }

 # для всех значений от 0 до 10 происходит лишь по одному вызову
 say fib(10);


Особенность применяется с глаголом, в данном случае – is. Он указывается в имени функции, обрабатывающей особенность, здесь — trait_mod:. Аргументами обработчика являются объект, к которому применяется особенность, и название особенности (cached) в качестве именованного аргумента.

В нашем примере вызывается метод .wrap функции, но вы, разумеется, можете вызывать что угодно. Обычно это используется для включения в функцию ролей или добавления их в таблицу распределения.

Особенности можно применять не только с функциями – но и с параметрами, атрибутами и переменными. К примеру, аксессоры с доступом к записи реализуются через особенность rw:

 class Book {
     has @.pages is rw;
     ...
 }

Также особенности используются для присоединения документации к классам и атрибутам, отметке параметров функций как перезаписываемых, и объявлений у классов наследования и применения к ним ролей.
Теги:perl 6traits
Хабы: Perl Программирование
Всего голосов 11: ↑9 и ↓2 +7
Просмотры1.9K

Похожие публикации

Разработчик perl
до 150 000 ₽ЭР-Телеком ХолдингМожно удаленно
Full stack-разработчик (Perl)
от 130 000 ₽Гнездо.ру - платформа эффективной рекламыМожно удаленно
Бэкенд-разработчик Python
от 80 000 ₽Whoer.netМожно удаленно
Python разработчик (удаленная работа)
от 80 000 ₽REG.RUМожно удаленно
Разработчик С/C++ (Junior/middle)
от 80 000 ₽EltexНовосибирск

Лучшие публикации за сутки