Perl有一个内部的伪模块UNIVERSAL,所有模块都从该伪模块继承。它具有来自the docs on DOES 的称为UNIVERSAL的方法。



我知道Moose等人提供了DOES,我知道如何使用它。 但是,就UNIVERSAL::DOES而言,什么是ROLE?如何跟踪它们?除了Moose 之外,他们如何创建来满足DOES?我尝试在源代码中查找the implementation of DOES was not providedROLE 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/

10-09 21:16