perl - 解释一下这个巫术!!! (在 Perl 中,使用 Moose 和命名空间::autoclean)

标签 perl moose symbol-table mop

这些天我正在处理一个使用 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/

相关文章:

perl - 如何使Perl为无效或不存在的文件引发错误?

perl - 将 CatalystX::I18N::Maketext 添加到我的 DBIC 架构中

perl - Moose:通过创建对象检查属性

perl - 不幸的哈希引用错误

编译器更改函数名称

regex - Perl 正则表达式匹配的第一个实例?跨多行

Perl 需要很长时间来评估 : keys %hash/iterate through a large hash

linux - 在 CLI 程序之间通过管道传输输出时出现缓冲问题

javascript - 如何将函数的参数重新分配回原始参数名称?

elf - 如何解释elf符号表部分的st_info字段