Особенности (Traits) – это удобный и расширяемый способ присоединения метаданных к различным видам объектов в Perl 6. Рассмотрим пример особенности с 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);
[Читать дальше →][1]
[1]:
http://habrahabr.ru/post/271711/#habracut