从驼鹿构建方法呱呱作响



如果BUILD方法失败,我希望我的类爆炸。但是,如果我使用croak来处理错误,则从Class/MOP/Method.pm报告错误,而不是调用者的代码。(也就是说,实例化对象的调用者。)现在,croak在呼叫树上的位置还不够高。

看:

package Test;
use Moose;
use Carp 'croak';
sub BUILD {
    croak 'u r dum';
}
1;

实例化Test的结果是:

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。如果查看confess输出,您将注意到:

Test::BUILD(…)called…类::MOP::方法::execute(…)called…Moose::Object::BUILDALL(…)called…Moose::Meta::Class::new_object(…)called…Moose::Object::new('Test')在./t.l pl第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在构造函数Test::new(定义在./t.pl第14行)第28行
从麋鹿

::食谱::基础知识::Recipe7:

第二,你不能再通过元类API进行更改,比如添加属性。在实践中,这不会是一个问题,因为您很少需要在第一次加载类后这样做。

我们强烈建议您使您的类不可变。它使您的代码更快,而编译时成本却很小。当创建许多对象时,这一点尤其明显。

相关内容

  • 没有找到相关文章

最新更新