我开始使用驼鹿了。这是我的测试包代码:
package MyTest;
use Moose;
use Moose::Util::TypeConstraints;
subtype 'MyStatus',
as 'Int',
where { $_ >= 0 && $_ < 10 },
message { "Wrong status: $_" };
has status => ( is => 'rw', isa => 'Maybe[MyStatus]' );
no Moose; 1;
以下是该计划:
use strict;
use warnings;
use MyTest;
my $t1 = MyTest->new('status' => 3);
$t1->status(100);
我希望得到一个“错误的状态:100”错误,但我得到了这个:
属性(状态)未传递类型约束,因为:在访问者MyTest :: s tatus(在MyTest.pm第10行定义)第4行的'Maybe [MyStatus]'值为100时验证失败
如何使该消息有效? 谢谢!
答案 0 :(得分:1)
Maybe[]
吃错误信息。如果您将其删除,则会从您的类型中提供message
。
has status => ( is => 'rw', isa => "MyStatus" );
这是错误:
属性(状态)不传递类型约束,因为:错误状态:100在访问者MyTest :: status(在/home/foo/code/scratch.pl第1331行定义)第4行 MyTest :: status(&#39; MyTest = HASH(0x3434c58)&#39;,100)在/home/foo/code/scratch.pl第1337行调用
这是因为Maybe[]
本身也只是一个函数调用。它使用您传递给构造函数的值(此处为MyStatus
)检查调用100
后面的代码ref的返回值。如果该类型检查通过,一切都很好。但是,如果该检查失败,Maybe[]
会发出自己的错误消息。
你应该问自己这个问题:你真的希望status
可以是undef
吗?你没有成功required
,所以你可以省略它。然后,您的对象没有状态,这与未定义状态不同。状态意味着对象处于某种状态,其中状态具有含义。如果该状态未定义,那对我来说听起来就像麻烦。