Perl有一个内部的伪模块UNIVERSAL
,所有模块都从该伪模块继承。它具有来自the docs on DOES
的称为UNIVERSAL
的方法。
我知道Moose等人提供了DOES
,我知道如何使用它。 但是,就UNIVERSAL::DOES
而言,什么是ROLE
?如何跟踪它们?除了Moose 之外,他们如何创建来满足DOES
?我尝试在源代码中查找the implementation of DOES
was not provided。 ROLE
perl中的CORE
这个概念是否有用?这似乎与 perldoc perlapi
's mention of sv_does_sv
(also sv_does
/ sv_does_pv
)有关
我可以在implementation of sv_does_sv
中看到对universal.c
的调用。 SV角色的定义是什么?在哪里可以找到更多有关此的信息?
从用户级别看,这里的代码是做什么的(这是一个子引用)UNIVERSAL->can('DOES')
在相同的调用中,返回的地址不同于UNIVERSAL->can('isa')
,所以它做的事情有所不同,我可以在上面链接的universal.c
中看到该烂摊子。
最佳答案
UNIVERSAL::DOES
等效于:
sub DOES {
croak "Usage: invocant->DOES(kind)"
if @_ != 2;
$_[0]->isa($_[1]);
}
在内部,
sv_does_sv
在传递的第一个SV上调用isa
方法。 perl本身不提供角色的实现,因此由角色模块提供一个DOES
来解决这些问题。Moose,Moo,Role::Tiny,Mouse等中的约定是
DOES
方法对类及其父类以及该类及其父类组成的角色适用。这些库还提供了does
方法,该方法仅对类及其父类的组合角色有效,而对于类或其父类则不适用。关于perl - UNIVERSAL中 "ROLE"的定义是什么,Perl角色如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57959140/