Base.pm
:駝鹿::角色與古怪覆蓋的方法
package Base;
use Moose::Role;
sub f {
my ($self) = @_;
print "In role.\n";
}
1;
X.pm
:
package X;
use Moose;
with 'Base';
around 'f' => sub {
my ($next, $self) = @_;
print "Nevermind, we are in class X.\n";
};
__PACKAGE__->meta->make_immutable;
1;
Y.pm
:
package Y;
use Moose;
with 'Base';
override 'f' => sub {
my ($self) = @_;
print "Nevermind, we are in class Y.\n";
};
__PACKAGE__->meta->make_immutable;
1;
然後X做的工作和Y沒有。這是一個奇怪的設計,因爲override
只是around
的特殊情況,作爲特殊情況也應該起作用。
任何人都可以解釋爲什麼這個設計決定,爲什麼它如此奇怪?
$ perl X.pm
$ perl Y.pm
Cannot add an override method if a local method is already present at /usr/lib/i386-linux-gnu/perl5/5.22/Moose/Exporter.pm line 419
Moose::override('f', 'CODE(0x9c002f8)') called at Y.pm line 9
但爲什麼在地球上,'around'在這種情況下** **不工作?關於'around'的說法不能說是不合理的嗎? – porton
明白了。但是在同一個類中同時使用* sub和'around'對於我來說就像是一個設計錯誤 – porton
***禁止***'sub f'和'around'f ''在同一個包中,因爲組成一個提供'f'的角色在包中安裝'f'作爲一個子。所以,這種禁止使得用組合的方法來使用'around'或者是不可能的或者困難的。我沒有想太多。 –