Moose:子类型消息未显示

时间:2016-11-11 15:56:47

标签: perl moose subtype

我开始使用驼鹿了。这是我的测试包代码:

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时验证失败

如何使该消息有效? 谢谢!

1 个答案:

答案 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,所以你可以省略它。然后,您的对象没有状态,这与未定义状态不同。状态意味着对象处于某种状态,其中状态具有含义。如果该状态未定义,那对我来说听起来就像麻烦。