perl – 用Moose BUILD方法呱呱叫

前端之家收集整理的这篇文章主要介绍了perl – 用Moose BUILD方法呱呱叫前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果BUILD方法失败,我希望我的课程爆炸.但是,如果我使用croak来处理错误,则会从Class / MOP / Method.pm而不是调用者的代码报告错误. (也就是说,实例化对象的调用者.)IOW,croak并没有在调用树上吠叫得足够多.

看吧:

package Test;

use Moose;
use Carp 'croak';

sub BUILD {
    croak 'u r dum';
}

1;

实例化测试结果:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Class/MOP/Method.pm line 125

Carp.pm应该注意一个名为@CARP_NOT的包变量来知道要避免哪些包,但它似乎只关注列表中的一个项目.例如,如果我将它添加到我的Test.pm:

our @CARP_NOT = ( 'Class::MOP::Method' );

然后结果是:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59

所以我也应该将它添加到数组中,对吧?

our @CARP_NOT = ( 'Class::MOP::Method','Moose::Object'  );

然后结果仍然是:

u r dum at /home/friedo/perl5/lib/perl5/x86_64-linux-gnu-thread-multi/Moose/Object.pm line 59

Moose :: Object似乎不受影响.

我现在一直在反对这个问题,现在似乎无法弄清楚是什么弄乱了它.

谢谢.

解决方法

make_immutable似乎解决了这个问题.当然,如果你确实需要你的课程是可变的,我不知道该怎么办.

如果没有make_immutable,Test-> new将调用Moose :: Object-> new.如果你看一下忏悔输出,你会注意到:

    Test::BUILD(...) called ...
    Class::MOP::Method::execute(...) called ...
    Moose::Object::BUILDALL(...) called ...
    Moose::Meta::Class::new_object(...) called ...
    Moose::Object::new('Test') called at ./t.pl line 17
#!/usr/bin/env perl

package Test;

use Moose;
use namespace::autoclean;

use Carp 'croak';

sub BUILD {
    croak 'u r dum';
}

__PACKAGE__->Meta->make_immutable;

package main;

my $t = Test->new;

输出

[sinan@archardy tmp]$./t.pl
u r dum at constructor Test::new (defined at ./t.pl line 14) line 28

Moose::Cookbook::Basics::Recipe7开始:

Second,you can no longer make changes via the Metaclass API,such as adding attributes. In practice,this won’t be a problem,as you rarely need to do this after first loading the class.

We strongly recommend you make your classes immutable. It makes your code much faster,with a small compile-time cost. This will be especially noticeable when creating many objects.

猜你在找的Perl相关文章