由于我的Moose构造函数中存在不完整的数据,QA给了我很多异常反馈。虽然构造函数参数中存在属性名称,但属性值为undef
。
对于许多脚本应用程序来说,有些事情就是undef
,这是很正常的现象。通常情况下这是没有问题的。您不希望从 pragma中收到烦人的警告(因此执行no warnings'未初始化'
命令),并且肯定不希望您的代码因为一个小值(比如门牌号)而死亡undef
。
所以,毋庸赘言,我希望我的Moose构造函数行为与纯Perl相同(即不使用use warnings 'uninitialized'
),即将undef
转换为0
或所需的空字符串。此示例中显示的尝试无法处理属性名称存在但值为undef
的情况。我考虑使用BUILDARGS
来实现我想要的结果。但是,在纯Moose中是否有一种声明性方法可以做到这一点,而不必使用MooseX::UndefTolerant(不幸的是,我无法使用它,因为它没有安装)?
package AAA;
use Moose;
has 'hu', is => 'ro', isa => 'Str';
has 'ba', is => 'ro', isa => 'Int';
no Moose; __PACKAGE__->meta->make_immutable;
package BBB;
use Moose; extends 'AAA';
has '+hu', default => ''; # don't want to die on undef
has '+ba', default => 0; # idem
no Moose; __PACKAGE__->meta->make_immutable;
package main;
use Test::More;
use Test::Exception;
# Those AAAs should die ...
throws_ok { AAA->new( hu => undef ) }
qr/Validation failed for 'Str' with value undef/;
throws_ok { AAA->new( ba => undef ) }
qr/Validation failed for 'Int' with value undef/;
# .. but these BBBs should live:
lives_ok { BBB->new( hu => undef ) } 'hu supplied as undef';
lives_ok { BBB->new( ba => undef ) } 'ba supplied as undef';
done_testing;
(defined($value))
。此外,你可以将MooseX::UndefTolerant
安装到本地目录$my_dir
中,并使用use lib($my_dir);
。 - yariancommon::sense
。我同意作者Marc Lehmann在他对未初始化值的讨论中的观点。(当然有例外情况,但是嘿-它们是例外)。预先检查值只是很繁琐的。我必须在许多地方重复检查,并尝试保持DRY。 - Lumi