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 に答える