这些天我正在处理一个使用 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
.
最佳答案
其实很简单。对于
some_sub()
some_sub
在编译时解析。对于
$o->some_method()
some_method
在运行时解析。它无法在编译时完成,因为它取决于 $o
的值。
关于perl - 解释一下这个巫术!!! (在 Perl 中,使用 Moose 和命名空间::autoclean),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14692623/