【发布时间】:2013-02-04 18:00:08
【问题描述】:
所以这些天我正在处理一个使用 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 时,这种诡计变得可能有什么不同?
ed. 要特别清楚,如果我将 use namespace::autoclean 替换为
CHECK { undef *Foo::imported_function }
那么文档中描述的Foo->bar; 调用会崩溃,因为Foo->bar 不知道在哪里可以找到imported_function。
【问题讨论】:
-
从长远来看:通过
use subs qw/imported_function/;预先声明会停止自动清洁吗?或者在加载namespace::autoclean之前导入?
标签: perl moose symbol-table mop