3

可以将它们添加到子类中或将它们混合在角色中,这很酷。我的问题是,当子类重新定义方法本身(而不是修饰符)时,基类中的方法修饰符似乎被停用。也许我理解方法修饰符是错误的。例子:

use feature 'say';

package Foo;
use Moose;

has called => (is => 'rw', isa => 'Bool', default => 0);
sub call { 'Foo called' }
after call => sub { shift->called(1) };

my  $foo = Foo->new();
say $foo->called;   # 0
say $foo->call;     # Foo called
say $foo->called;   # 1

package Bar;
use Moose;
extends 'Foo';

sub call { 'Bar called' }

my  $bar = Bar->new();
say $bar->called;   # 0
say $bar->call;     # Bar called
say $bar->called;   # 0

我希望最后一个输出1$foo. 我究竟做错了什么?

4

2 回答 2

2

发生的事情是这样的

  • 你定义了一个 Foo::call
  • 你用 after 修改它
  • 你定义了一个不调用 Foo::Call 的 Bar::call

修饰符不是神奇的运行时东西,而是类定义时间的东西。要在此处执行您尝试执行的操作,您必须以不同的方式构建代码

于 2012-11-09T19:36:48.753 回答
0

@RobEarl 发布了一个非常相似问题的链接。那里发布的解决方案是使用augment,虽然它看起来有点奇怪并且它的使用是有争议的,但它可以解决我的问题:

package Foo;
use Moose;

has called => (is => 'rw', isa => 'Bool', default => 0);
sub call { inner(); shift->called(1); 'Foo called' }

package Bar;
use Moose;
extends 'Foo';

augment call => sub { 'Bar called' };

my  $bar = Bar->new();
say $bar->called;   # 0
say $bar->call;     # Bar called
say $bar->called;   # 1
于 2012-11-10T10:52:31.593 回答