gpt4 book ai didi

perl - Moose - 导入的函数不算作角色方法?

转载 作者:行者123 更新时间:2023-12-05 01:34:27 27 4
gpt4 key购买 nike

我有一个角色声明它需要一个方法(使用requires)。我试图通过直接在类的符号表中定义来安装该方法。但是,在某些情况下它有效,而在其他情况下则无效。

在下文中,WORKS 表示未报告任何错误,DOESN'T WORK 表示我收到错误:'arole' 要求方法 'finddepth' 由 'aclass' 实现

package arole;

use Moose::Role;

requires 'finddepth';

package anexporter;

sub import {
no strict 'refs';
*{ "aclass::finddepth" } = sub {};
}

package anexporter2;
sub import {
eval "sub aclass::finddepth {}";
}

package aclass;

use Moose;

# WORKS:
# sub finddepth { }

# WORKS:
# BEGIN { *{finddepth} = sub {} };

# DOESN'T WORK:
# use File::Find qw(finddepth);

# DOESN'T WORK:
# BEGIN { anexporter->import };

# WORKS:
# BEGIN { no strict 'refs'; *{ "aclass::finddepth" } = sub { }};

# WORKS:
# BEGIN { anexporter2->import };

with 'arole';

1;

最佳答案

这里的问题是 Moose 非常努力地跟踪方法的来源,这样本地包中未定义的任何内容都不会意外地被视为方法。

如果您不使用原始 glob,而是使用 Moose 元协议(protocol)来注入(inject)导入,这会起作用,因为 Moose 然后会知道您正在尝试显式添加方法。

package anexporter {

sub import {
aclass->meta->add_method(finddepth => sub {})
}

}

然而,这确实意味着 CPAN 上的任何内容(如 File::Find 的 finddepth)都需要被包装。由于通常不希望将导出作为方法调用,因此可能无论如何都需要发生。

关于perl - Moose - 导入的函数不算作角色方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7364707/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com