在例程中§

有关trait is cached,请参阅主要文档 上下文

multi trait_mod:<is>(Routine $r:$cached!)

导致例程的返回值被存储,以便在使用相同参数列表进行后续调用时,可以立即返回存储的值,而不是重新运行例程。[1]

当存储和返回计算值比每次重新计算它快得多,并且节省的时间胜过使用更多内存的成本时,这很有用。

即使传递给例程的参数是“引用类型”(例如对象或数组),那么为了缓存的目的,它们将仅根据其内容进行比较。因此,在这种情况下,第二次调用将命中缓存

say foo( [123] );   # runs foo 
say foo( [123] );   # doesn't run foo, uses cached value 

由于它仍处于实验阶段,因此您必须在使用它的任何模块或脚本中插入 use experimental :cached; 语句。

use experimental :cached;
 
sub nth-prime(Int:D $x where * > 0is cached {
    say "Calculating {$x}th prime";
    return (2..*).grep(*.is-prime)[$x - 1];
}
 
say nth-prime(43);
say nth-prime(43);
say nth-prime(43);

产生此输出

Calculating 43th prime
191
191
191

注意:此功能不是线程安全的。