有没有办法让我从我的来电者那里返回而不是我的来电者?例如
sub foo {
bar();
# this never gets executed
}
sub bar {
return_from_caller(5);
}
# This prints 5
print foo();
(基本原理:我正在编写一个函数 memoize_self,它从函数本身中记住一个函数。我希望它像这样工作:
sub complex_function {
my ($x, $y) = @_;
memoize_self({key => $y, expires_in => '5min'));
# compute $result
return $result;
}
memoize_self 将检查其缓存,如果命中,则从其调用者返回缓存值。否则,它将重新调用该函数(使用动态范围的 var 以避免明显的无限循环),将返回值存储在缓存中并再次返回它。
如果没有从调用者返回的能力,我可能会使用 $_ 并这样写:
return $_ if memoize_self({key => $y, expires_in => '5min'));
但这是额外的噪音,也没有考虑上下文。)
编辑:对于那些合理地建议Memoize的人——是的,我应该说,我很了解这个模块。我正在写一个基于CHI的更现代、更有特色的 Memoize 版本。
但就这个问题而言,在某些情况下,从函数内部而不是函数外部进行记忆是有用的(记忆只做后者)。它可以很容易地自定义缓存键和/或确定是否要为这个特定的调用进行记忆。例如
sub complex_function {
my $key = ...; # normalize arguments
if (...) { # is it worth memoizing in this case?
memoize_self({key => $key});
}
}
我也喜欢它被包裹在函数中的方式,而不是在外部创建自己的行,ala state variables。