存储在数据结构中的匿名子例程/子例程引用

时间:2013-05-13 23:45:07

标签: perl perl-data-structures

Why would I use Perl anonymous subroutines instead of a named one?激励我思考以下方面的优点:

  • 在数组,散列和标量中存储匿名子。

这是一个非常酷的概念,但它在任何方面都很实用吗?我有必要使用存储在某种数据结构中的匿名子/子引用吗?或者也许是方便的情况?

我理解为什么在某些上下文中需要匿名子类,例如处理共享变量(当在另一个sub中声明匿名子时),但除非我遗漏了某些内容,否则我只是看不到使用任何内容的意义。一种功能参考。看起来我们应该直接调用函数,代码看起来会更好/更有条理。

请告诉我,我错了。我很想有充分的理由使用这些东西。

提前致谢。

2 个答案:

答案 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。

同样,迭代器非常有用。另外,考虑存储以后可以解决的例程,而不是仅存储静态值。

最后,如果您不想存储您的业务的匿名例程(甚至是对例程的引用)。但是选择比没有它更好。