我已经使用强制创建了子类型Birth_d,如下所示,我正在尝试将其与内置的Maybe类型结合使用,每个
Moose::Manual::Types.
我收到错误你不能强迫属性(birth_d),除非它的类型(Maybe [Birth_d])有强制.这是完整的测试代码:
package Student; use Moose; use Moose::Util::TypeConstraints; use DateTime::Format::MysqL; class_type 'Birth_d',{ class => 'DateTime' }; coerce 'Birth_d',from 'Str',via { DateTime::Format::MysqL->parse_date( $_ ) }; has 'name' => ( isa => 'Str',is => 'ro',); has 'birth_d' => ( isa => 'Maybe[Birth_d]',# This works: isa => 'Birth_d' coerce => 1,); package main; use Test::More; my $student = Student->new( name => 'Johnnie Appleseed',birth_d => '2015-01-01' ); is ( $student->birth_d->ymd(),'2015-01-01' ); my $student2 = Student->new( name => 'Foo Bar',birth_d => undef ); is( $student2->birth_d,undef );
替换isa => ‘is [Birth_d]’is isa => ‘birth_d’有效,但不是必需的.我需要使birth_d可选,如果没有提供,应该是undef.
我应该补充一点,我尝试使用MooseX :: Types将这个Birth_d类型放在一个单独的地方,但是发现它使用的裸字有点不正统,所以我慢慢退缩了.如果有意义的话,我愿意重新考虑它.
解决方法
我会发现没有Maybe [Birth_d]类型更有用,但只是使用Birth_d类型声明属性,而不是“required”设置.
这样,如果传入有效的String,它将被接受,无效的String将导致错误,并且不需要传递任何内容.
但是,您可以强制使用以下类型:
subtype 'MaybeBirth_d',as maybe_type(class_type('DateTime')); coerce 'MaybeBirth_d',via { DateTime::Format::MysqL->parse_date( $_ ) }; has 'birth_d' => ( isa => 'MaybeBirth_d',coerce => 1,);
我只是没有看到能够通过undef传递生日的价值 – 这比设置它更好吗?
我还建议不使用Moose :: Util :: TypeConstraints;没有驼鹿;在包的末尾,或者namespace :: autoclean;在开头,以及__PACKAGE __-> Meta-> make_immutable;在学生班结束时.