为什么 Moose Role 方法会覆盖 parents 定义?

Why a Moose Role method overrides parents definition?

方法 aAA::B 中定义。

C 派生自 A 并使用 A::B.

问题 1:为什么 A::B->a 覆盖 A->a

$ perl x.pl 
b

问题 2:如果我们将 sub a {'c'} 添加到 C,为什么 A::B->a 不会覆盖 C->a

A.pm: 基础 class

package A;
use Moose;
sub a {
    return 'a';
}
no Moose;
1;

A/B.pm: 一个角色

package A::B;
use Moose::Role;
sub a {
    return 'b';
}
1;

C.pm:派生自 A 的 class,角色为 A::B

package C;
use Moose;
extends "A";
with "A::B";
no Moose;
1;

bin.pl

use v5.10;
use strict;
use warnings;
use C;
my $c = C->new();
say $c->a;
package C;
use Moose;
extends 'A';

使包 C 成为 A 的子类。在幕后,它将 A 添加到 @C::ISA。当类型 C 的对象调用方法并且在名称空间 C 中找不到方法名称时,perl 将检查 @C::ISA 中的名称空间以寻找解析方法名称的方法。

package C;
use Moose;
with 'A::B';

做一些不同的事情。它不会使 C 成为 A::B 的子类。它将条目从 A::B 命名空间复制到 C 命名空间。

因此,当您调用 $c->a 时,Perl 会找到一个子例程 &C::a,因为它是从 &A::B::a 复制而来的,这就是它所使用的。它不需要遍历 @C::ISA 来搜索另一个名为 a.

的子例程

如果你在package C中也定义了一个sub a { ... },那么use Moose ... with 'A::B'将不会覆盖它。