有没有办法让我从我的来电者返回而不是给我的来电者?例如
sub foo {
bar();
# this never gets executed
}
sub bar {
return_from_caller(5);
}
# This prints 5
print foo();
Run Code Online (Sandbox Code Playgroud)
(理由:我正在编写一个函数memoize_self,它在函数本身内记忆一个函数.我希望它能像这样工作:
sub complex_function {
my ($x, $y) = @_;
memoize_self({key => $y, expires_in => '5min'));
# compute $result
return $result;
}
Run Code Online (Sandbox Code Playgroud)
memoize_self将检查自己的缓存,如果它得到一击,返回缓存值从它的调用者.否则,它将重新调用该函数(使用动态范围的var来避免明显的无限循环),将返回值存储在缓存中并再次返回它.
如果没有从调用者返回的能力,我可能会使用$ _并以这种方式编写它:
return $_ if memoize_self({key => $y, expires_in => '5min'));
Run Code Online (Sandbox Code Playgroud)
但这是额外的噪音,也没有考虑上下文.)
编辑:对合理建议Memoize的人 - 是的,我应该说,我很了解这个模块.我正在编写一个基于CHI的更现代和功能更强的Memoize版本.
但作为涉及到这个问题,有些情况下是非常有用的,以memoize的案件中的作用,而不是外界的功能(memoize的只做后者).它可以轻松自定义缓存键和/或确定是否要为此特定调用进行任何记忆.例如
sub complex_function {
my $key = ...; # normalize arguments
if (...) { # is it worth memoizing in this case?
memoize_self({key => $key});
}
}
Run Code Online (Sandbox Code Playgroud)
我也喜欢它在函数中被包裹的方式而不是在外面创建自己的行,ala 状态变量.