我可以这样做:
package Foo;
use Moose;
has 'time' => (
is => 'rw',
isa => 'DateTime'
);
package main;
use DateTime;
my $a = Foo->new(time => DateTime->now);
但不是这样:
package Foo;
use Moose;
has 'time' => (
is => 'rw',
isa => 'DateTime | Str'
);
package main;
use DateTime;
my $a = Foo->new(time => DateTime->now);
因为它引发了一个例外:
Could not locate type constraint (DateTime) for the union
at /opt/xt/xt-perl/lib/site_perl/5.8.8/Moose/Util/TypeConstraints.pm line 89
首先不定义SubType。为什么会这样,有没有办法解决它(除了定义一个检查'isa'的子类型)?
答案 0 :(得分:19)
当Moose创建一个类型联合时,它必须知道联合的所有组件。在这种情况下,它还不知道DateTime类型。但是,当您在Moose中创建属性并且Moose无法识别该类型时,它会假设您需要isa
中的字符串的类类型,并且只是这样做。您只需加载Moose::Util::TypeConstraints并执行
class_type 'DateTime';