所以这些天我正在处理一个使用 Perl 和 Moose 的项目。我了解 Moose 是建立在 MOP 之上的。我对MOP不是太熟悉,也遇到过不明白的,可以用理论上的解释。这是模块namespace::autoclean
的文档:
SYNOPSIS
package Foo;
use namespace::autoclean;
use Some::Package qw/imported_function/;
sub bar { imported_function('stuff') }
# later on:
Foo->bar; # works
Foo->imported_function; # will fail. imported_function got cleaned after compilation
所以,在我使用 Moose 之前,您在对象上调用方法的方式是:Perl 解释器会在您的对象被祝福到的包的符号表中查找该方法(然后,如果没有找到,请考虑@ISA
继承等)。它从包中调用导入函数的方式是:它在包的符号表中查找函数的名称。据我所知,无论哪种方式,这意味着相同的符号表,所以这种行为应该是不可能的。
我对源头的初步检查没有成效。从广义上讲,当使用 Moose、MOP 和 namespace::autoclean 时,这种诡计变得可能有什么不同?
编。要特别清楚,如果我要替换use namespace::autoclean
为
CHECK { undef *Foo::imported_function }
那么Foo->bar;
文档中描述的调用会崩溃,因为Foo->bar
不知道在哪里可以找到imported_function
.