Особенности (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);
Читать дальше →
Комментариев нет:
Отправить комментарий