基类中的Moose方法修饰符没有被调用

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

我期望最后的输出结果像$foo一样是1。我错在哪里了?


2
看起来像这样:https://dev59.com/Nm445IYBdhLWcg3wQX6G - RobEarl
谢谢,@RobEarl,我一定会看看的! :) - memowe
2个回答

2

具体情况如下:

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

这些修饰符并不是神奇的运行时产物,而是类定义时的东西。要做到你在这里尝试做的事情,你必须以不同的方式组织你的代码。


谢谢,Leon!你有想法如何完成我在这里尝试做的事情吗? - memowe

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接