3

次のように、文字列から DateTime への強制が定義されたカスタム DateTime 型があります。

package Library;
use Type::Library -base, -declare => qw(DateTime);
use DateTime::Format::ISO8601;

class_type DateTime, { class => 'DateTime' };

coerce DateTime, from Str, via { DateTime::Format::ISO8601->parse_datetime($_) };

次のように、その DateTime 型を Dict で使用したいと思います。

package MyObj;
use Moo;
$constraint = declare MyType, as Dict[ name => Str, date => DateTime ];

has 'whatsis' => ( is => 'ro', isa => $constraint );

そして、次のように呼び出します。

use MyObj;
my $obj = MyObj->new( whatsis => { name => 'Something', date => '2016-01-01' } );

coerce => 1の宣言に追加しようとしましたwhatsisが、うまくいきませんでした。

Dict から継承し、メンバー型で定義された型強制を実行するカスタム型を作成するにはどうすればよいですか?

4

1 に答える 1

2

https://metacpan.org/pod/distribution/Type-Tiny/lib/Type/Tiny/Manual/Coercions.podから多くの助けを借りて

Library.pm:

package Library;
use Type::Library -base, -declare => qw(Datetime);
use Type::Utils -all;
use Types::Standard -all;
use DateTime::Format::ISO8601;

class_type Datetime, { class => 'DateTime' };
coerce Datetime,
  from Str, via { DateTime::Format::ISO8601->parse_datetime($_) };

declare 'MyType', as Dict[ name => Str, date => Datetime ], coercion => 1;

MyObj.pm:

package MyObj;
use Moo;
use Library -all;

has 'whatsis' => ( is => 'ro', isa => MyType, coerce => 1 );

tester.pl:

#!perl
use MyObj;
my $obj = MyObj->new( whatsis => { name => 'Something', date => '2016-01-01' } );
use Data::Dumper; print Dumper $obj;
于 2017-08-24T06:01:20.197 に答える