为什么我可以使用类名作为Moose类型,但不能在类型联合的一部分时使用?

cub*_*bit 13 perl moose

我可以做这个:

package Foo; 
use Moose; 

has 'time' => (
    is => 'rw', 
    isa => 'DateTime'
);

package main;
use DateTime; 

my $a = Foo->new(time => DateTime->now);
Run Code Online (Sandbox Code Playgroud)

但不是这个:

package Foo; 
use Moose; 

has 'time' => (
    is => 'rw', 
    isa => 'DateTime | Str'
);

package main;
use DateTime; 

my $a = Foo->new(time => DateTime->now);
Run Code Online (Sandbox Code Playgroud)

因为它引发了一个例外:

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
Run Code Online (Sandbox Code Playgroud)

不首先定义SubType.为什么会这样,有没有办法(除了定义一个检查'isa'的子类型)?

小智 19

当Moose创建一个类型联合时,它必须知道联合的所有组件.在这种情况下,它还不知道DateTime类型.但是,当您在Moose中创建属性并且Moose无法识别该类型时,它会假设您需要字符串的类类型isa并且只是这样做.您可以通过简单地加载解决你的问题穆斯::的Util :: TypeConstraints和做

class_type 'DateTime';
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你回答这个问题.同样的问题在过去激怒了我. (2认同)