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;在学生班结束时.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...