【问题标题】:MooseX::Types and coercion errorMooseX::Types 和强制错误
【发布时间】:2013-10-30 21:38:01
【问题描述】:

随着this answer 的继续,哇,我正在与我自己的 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 真的绝望了,请帮助...

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

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    您需要告诉 Moose 可以在该属性上使用强制转换。为此,您可以在属性定义中添加 coerce

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

    【讨论】:

    • 该死,这是一个 F@#^$@#^@*&^#*^@%^it 错误!。我很确定,它 MooseX::Types doccu 中也没有。非常感谢您。 ;)
    猜你喜欢
    • 2011-09-04
    • 2019-04-24
    • 1970-01-01
    • 2017-12-22
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多