MooseX :: Types和强制错误

Novacik

随着这个答案的继续,我正在与自己的Moose“类型库”进行斗争-因此尝试使用“ MooseX :: Types ”。

基于以上MooseX::Types文档,并对以上答案进行“ hoobs”注释,接下来,我定义了自己的“类型”:

package MyTypes;
use 5.016;
use Moose;
use MooseX::Types -declare => [qw( Dir File )];    
use MooseX::Types::Moose qw( Str );

use Path::Class::Dir;
use Path::Class::File;

class_type Dir, { class => 'Path::Class::Dir' };
coerce Dir, from Str, via { Path::Class::Dir->new($_) };

class_type File, { class => 'Path::Class::File' };
coerce File, from Str, via { Path::Class::File->new($_) };

1;

并用在我的包里

package MyDir;
use Moose;
use warnings;
use MyTypes qw(Dir);    #to get the Dir type and its coercion

has 'path' => (
    is => 'ro',
    isa => Dir,      # Dir is defined in the package MyTypes
    required => 1,
);
1;

并尝试了下一个简短的脚本

use 5.016;
use warnings;
use MyDir;
my $d = MyDir->new(path => "/tmp");

错误:

Attribute (path) does not pass the type constraint because: Validation failed for 'MyTypes::Dir' with value /tmp (not isa Path::Class::Dir) at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 1279.
    Moose::Meta::Attribute::verify_against_type_constraint(Moose::Meta::Attribute=HASH(0x7f9e9b1c2618), "/tmp", "instance", MyDir=HASH(0x7f9e9b826bb8)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 1266
    Moose::Meta::Attribute::_coerce_and_verify(Moose::Meta::Attribute=HASH(0x7f9e9b1c2618), "/tmp", MyDir=HASH(0x7f9e9b826bb8)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 536
    Moose::Meta::Attribute::initialize_instance_slot(Moose::Meta::Attribute=HASH(0x7f9e9b1c2618), Moose::Meta::Instance=HASH(0x7f9e9b1c3588), MyDir=HASH(0x7f9e9b826bb8), HASH(0x7f9e9b826a98)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Class/MOP/Class.pm line 525
    Class::MOP::Class::_construct_instance(Moose::Meta::Class=HASH(0x7f9e9b9e6990), HASH(0x7f9e9b826a98)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Class/MOP/Class.pm line 498
    Class::MOP::Class::new_object(Moose::Meta::Class=HASH(0x7f9e9b9e6990), HASH(0x7f9e9b826a98)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Class.pm line 284
    Moose::Meta::Class::new_object(Moose::Meta::Class=HASH(0x7f9e9b9e6990), HASH(0x7f9e9b826a98)) called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Object.pm line 28
    Moose::Object::new("MyDir", "path", "/tmp") called at t.pl line 5

因此,不要接受“ Str”,也不要进行强制。

以上几行有什么问题?我可以确定它确实是一个很小的错误,因为我遵循了MooseX :: Types文档(至少我希望如此)-但找不到错误。

我对Moose感到非常绝望,请帮助...

附:我的目标是在一个地方(包)中定义我自己的所有“类型”,并在我需要它们的任何地方使用它,只需一个“使用...”即可。

AK荷兰

您需要告诉Moose在该属性上使用强制是可以的。您可以通过添加coerce到属性定义中来做到这一点

has 'path' => (
    is => 'ro',
    isa => Dir,      # Dir is defined in the package MyTypes
    required => 1,
    coerce => 1,
    );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Moose:类型库(MooseX :: Types)

Perl MooseX :: Declare与方法属性MooseX :: MethodAttributes

这是MooseX :: Getopt的正确(预期)用法吗?

如何使用MooseX :: Storage存储一个大的HashRef?

MooseX :: NonMoose对于Moo而言等效于什么?

为什么得到“属性(类)未通过类型约束,因为:'MooseX :: Runnable :: Invocation :: RunnableClass'验证失败”?

获取不匹配指定签名和强制转换错误的循环

ActionScript 3.0和“ TypeError:错误#1034:类型强制转换失败”

避免最小和最大属性的范围错误并强制提交表单

CmdletBinding 中的参数不是强制性的和错误/拼写错误检查

将charAtIndex分配给stringWithCharacters会给出无效的强制转换警告和错误的访问错误

错误的大向量强制?

Lambda和强制转换交集类型(Eclipse编译器错误)

使用mvc在htaccess中强制使用https显示js和css文件的404错误

为什么混合+和强制转换在“ +(int)+(long)-1”中不会产生错误?

分支和边界错误:无法将Node1强制转换为java.lang.Comparable

如何使用Scapy PcapWriter对数据包强制执行错误的校验和?

Laravel强制www和HTTPS错误:重定向到index.php

来自整数的冲突类型错误和指针没有强制转换警告 C

尝试使用TextWatcher创建的数组会导致错误和强制关闭

SAML和强制SSL

自身类型和委托类型以进行强制转换以修复objc_msg发送错误的参数数量错误吗?

Golang中的强制返回错误

返回错误的类型-强制转换?

如何强制Parsec返回错误?

Javascript类型强制中的错误

AngularJS中的强制错误状态

错误:强制UnsupportedOperationException的静态类

sql datetime强制转换错误