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开始:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |