perl – 如何在构造对象时不执行触发器
发布时间:2020-12-15 23:27:30 所属栏目:大数据 来源:网络整理
导读:我有这个代码: 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.pltrigger! value:
我有这个代码:
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中触发器的默认记录行为. 如果通过构造函数设置属性,如何禁用触发器执行? 我当然可以这样做: 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 所以它有效,但……感觉不对;). 解决方法
我对Moo知之甚少,但在Moose中你可以在构造函数之后实现自己的代码.如果你可以在Moo中做这样的事情,它会给你想要的效果.
sub BUILD { my $self = shift; # Sets "useTriggers" AFTER the object is already constructed. $self->useTriggers(1); }; 这将导致useTriggers在构造之后立即设置,因此触发器将在构造对象之后激活,但在构造之前不会激活. 所以你应该写: my $foo->new(attr => 1); $foo->attr(2); 并获得相同的输出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |