微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl – Attribute is =>’可能[SomeSubtype]’返回Attribute()不传递类型约束

我已经使用强制创建了子类型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;在学生班结束时.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐