4

私はこのコードを持っています:

package Foo;
use Moo;

has attr => ( is => "rw", trigger => 1 );

sub _trigger_attr 
    { print "trigger! value:". shift->attr ."\n" }


package main;
use Foo;

my $foo = Foo->new( attr => 1 );
$foo->attr( 2 );

戻り値:

$ perl test.pl
trigger! value:1
trigger! value:2

これは、Moo の Triggers のデフォルトの文書化された動作です。

属性がコンストラクターを介して設定されている場合、トリガーの実行を無効にするにはどうすればよいですか?

もちろん、私はこのようにすることができます:

package Foo;
use Moo;

has attr        => ( is => "rw", trigger => 1 );
has useTriggers => ( is => "rw", default => 0 );

sub _trigger_attr 
{ 
    my $self = shift;
    print "trigger! value:". $self->attr ."\n" if $self->useTriggers 
}

package main;
use Foo;

my $foo = Foo->new( attr => 1 );
$foo->useTriggers( 1 );
$foo->attr( 2 );

そして得る:

$ perl testt.pl
trigger! value:2

それでうまくいきますが...それは間違っていると感じます;)。

4

2 に答える 2