Eva*_*oll 6 perl roles universal
Perl有一个内部的psuedo模块UNIVERSAL,所有模块都继承自该模块。它有一个调用的方法DOES,从在文档UNIVERSAL。
$obj->DOES( ROLE )
CLASS->DOES( ROLE )
DOES检查对象或类是否扮演角色ROLE。角色是特定行为的命名组(通常是特定名称和签名的方法),类似于类,但本身不一定是完整的类。例如,日志记录或序列化可能是角色。
DOES和isa是类似的,就是如果其中一个是真的,你知道,在其上调用方法的对象或类可以执行特定的行为。但是,DOES不同之处isa在于,它并不关心被调用方如何执行操作,而只是在乎。(isa当然要求继承关系。其他关系包括聚合,委派和模拟。)角色和类之间存在关系,因为每个类都隐含着同名角色。继承和角色之间也存在关系,因为从祖先类继承的子类隐式执行其父级执行的任何角色。因此,你可以使用
DOES替代的isa安全,因为它会在所有的地方返回trueisa将返回true(假设每个重写DOES和isa方法做出相应的表现)。
我知道Moose等人提供了DOES,并且我知道如何使用。但是从UNIVERSAL::DOES什么意义上ROLE说呢?如何跟踪它们?他们是如何创建除了驼鹿满足DOES?我试图寻找源,但执行DOES未提供。这是Perl中ROLE某些东西的概念CORE吗?这似乎与(也/ )perldoc perlapi的提及有关sv_does_svsv_doessv_does_pv
sv_does_sv返回一个,boolean指示是否SV执行特定的命名角色。该SV可以是一个Perl的对象或一个Perl类的名称。
bool sv_does_sv(SV* sv, SV* namesv, U32 flags)
我可以sv_does_sv在的执行中universal.c看到的呼叫。SV角色的定义是什么?在哪里可以找到更多有关此的信息?
从用户级别看,这里的代码是做什么的(这是一个子引用)
UNIVERSAL->can('DOES')
Run Code Online (Sandbox Code Playgroud)
返回的地址不同于UNIVERSAL->can('isa')同一调用中的地址,因此它执行的操作有所不同,我可以在上面的link中看到该地址universal.c。
将UNIVERSAL::DOES等同于:
sub DOES {
croak "Usage: invocant->DOES(kind)"
if @_ != 2;
$_[0]->isa($_[1]);
}
Run Code Online (Sandbox Code Playgroud)
在内部,在传递的第一个SV上sv_does_sv调用该isa方法。perl本身不提供角色的实现,因此将其留给角色模块来提供对角色的DOES解释。
Moose,Moo,Role :: Tiny,Mouse等中的约定是,该DOES方法适用于类及其父类,以及该类及其父类组成的角色。这些库还提供该does方法,仅对类及其父类的组合角色有效,而对于类或其父类则不适用。
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |