1

我在第 12 章阅读编程 perl,对象,有以下文档:

next::method 也有类似的问题,因为它使用调用者的包来确定要查看的类。如果你在 Donkey 中从另一个包中定义一个方法, next::method 将中断:

package main;
*Donkey::sound = sub { (shift)–>next::method(@_) };

匿名子例程在堆栈中显示为 _ ANON _,因此 next::method 不知道它在哪个包中。不过,您可以使用 Sub::Name CPAN 模块来解决它:

use Sub::Name qw(subname);
*Donkey::sound = subname 'Donkey::sound' => sub { (shift)–>next::method(@_) };

我很好奇 Sub::Name 模块是如何完成这项工作的?让匿名子程序的调用者不是 __ANON__

非常感谢您的帮助:)

4

1 回答 1

2

在匿名子例程中,您可以通过设置为所需的名称来实现此目的*__ANON__

$sub = sub {
    local *__ANON__ = 'Donkey::sound';
    ...

但是 Sub::Name 从外部设置它。快速浏览一下代码让我认为它在戳和刺激设置*__ANON__所做的相同的事情,而你不能从 perl 代码中做到这一点。它在 XS 中是因为它必须如此,而不是因为那样更快。

于 2017-10-09T16:31:45.953 回答