加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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);

并获得相同的输出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读