1

为什么我要使用 Perl 匿名子例程而不是命名的子例程?启发我思考以下优点:

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

这是一个非常酷的概念,但它是否实用?有什么理由我必须使用存储在某种数据结构中的匿名子/子引用?或者可能是一种方便的情况?

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

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

提前致谢。

4

2 回答 2

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()。)

于 2013-05-14T01:18:10.303 回答
2

面向对象的方法非常类似于匿名子例程。多态性意味着对象的方法可以更改,而调用代码无需手动查找以查看要运行的例程。这非常有用。

另外,考虑一下 perl 的排序。为什么要为简单的排序方法设置命名例程?同上 map 和 grep。

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

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

于 2013-05-14T01:46:08.643 回答