Why would I use Perl anonymous subroutines instead of a named one?激励我思考以下方面的优点:
这是一个非常酷的概念,但它在任何方面都很实用吗?我有必要使用存储在某种数据结构中的匿名子/子引用吗?或者也许是方便的情况?
我理解为什么在某些上下文中需要匿名子类,例如处理共享变量(当在另一个sub中声明匿名子时),但除非我遗漏了某些内容,否则我只是看不到使用任何内容的意义。一种功能参考。看起来我们应该直接调用函数,代码看起来会更好/更有条理。
请告诉我,我错了。我很想有充分的理由使用这些东西。
提前致谢。
答案 0 :(得分:5)
调度表可用于根据某些值动态确定要采取的步骤:
my %disp = (
foo => sub { 'foo' },
bar => sub { 'bar' },
);
my $cmd = get_cmd_somehow();
if (defined $disp{$cmd}) {
$disp{$cmd}->(@args)
} else {
die "I don't know how to handle $cmd"
}
(方法调度通过 - > can($ method)在概念上类似,但更灵活,细节被隐藏。)
匿名函数和词法闭包有许多其他用途;或许深入研究“高阶函数”。 (例如,考虑map()/ grep()。)
答案 1 :(得分:2)
面向对象的方法非常类似于匿名子例程。多态性意味着对象的方法可以更改,而调用代码不必手动执行查找以查看要运行的例程。这非常有用。
另外,请考虑perl的排序。为什么只为简单的排序方法设置一个命名例程?同上地图和grep。
同样,迭代器非常有用。另外,考虑存储以后可以解决的例程,而不是仅存储静态值。
最后,如果您不想存储您的业务的匿名例程(甚至是对例程的引用)。但是选择比没有它更好。