首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moose:类型库(MooseX::type )

Moose:类型库(MooseX::type )
EN

Stack Overflow用户
提问于 2016-11-11 21:13:38
回答 2查看 182关注 0票数 2

我正试图找出适当的方法,将驼鹿纳入我的项目。这里 --我发现了一篇文章,建议Moose类型应该组织在类型库中,这似乎是个好主意。因此,我根据提供的示例编写了以下代码:

文件1: MyTypeLib.pm

代码语言:javascript
复制
package MyTypeLib;
use MooseX::Types -declare => [ qw( MyStatus ) ];
use MooseX::Types::Moose qw/Int/;

subtype MyStatus,
      as Int,
      where { $_ >= 0 && $_ < 10 },
      message { "Wrong status: $_" };

1;

文件2: MyTest.pm

代码语言:javascript
复制
package MyTest;
use MyTypeLib qw( MyStatus );
use Moose;

has status => ( is => 'rw', isa => 'MyStatus' );

no Moose; 1;

文件3: MyMain.pl

代码语言:javascript
复制
use strict;
use warnings;
use MyTest;

my $t1 = MyTest->new('status' => 5);

当我运行它时,我会收到这样的消息:

属性(status)没有通过类型约束,因为:对值为5(不是isa MyStatus)的'MyStatus‘在C:\Strawberry\perl\vendor\lib\Moose\Object.pm第24行的验证失败

当我在MyTest.pm中保留子类型定义而不使用MooseX::Types时,一切都按预期工作。但重点是将子类型移动到单独的包中,并在其他包中使用它们。请有人建议如何使它工作,或指向(或张贴)一些工作的例子,或建议实现目标的替代方式。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-12 05:35:00

删除引号:isa => MyStatus,而不是isa => 'MyStatus'MyStatus是从类型库导出的类似常量的函数.为isa提供一个字符串而不是一个适当的类型约束("stringy“)会导致在Moose的类型注册中心中查找它,或者,如果在那里找不到它,它就被解释为一个类的名称,并且该类型被推断为”该类的任何对象或它的子类“。与使用实际类型相比,字符串类型不那么显着,也不那么灵活,而且更容易发生冲突,因为它们都共享全局命名空间。最好不要同时使用它们和输入lbraries。

票数 2
EN

Stack Overflow用户

发布于 2016-11-12 05:26:08

这似乎很管用

MyTypeLib.pm

代码语言:javascript
复制
package MyTypeLib;
use Moose::Util::TypeConstraints;

subtype MyStatus =>
      as 'Num' =>
      where { $_ >= 0 && $_ < 10 },
      message { "Wrong status: $_" };

#coerce MyStatus => from Int => via { $_ };
1;

MyTest.pm

代码语言:javascript
复制
package MyTest;
use MyTypeLib;
use Moose;

has status => ( is  => 'rw', 
                isa => 'MyStatus', 
                #coerce => 1 i
);

no Moose; 1;

MyMain.pl

代码语言:javascript
复制
use strict;
use warnings;
use MyTest;
use Data::Dumper;

my $t1 = MyTest->new( status => 5);
print Dumper $t1;
my $t2 = MyTest->new( status => 10);

这给

代码语言:javascript
复制
$ perl MyMain.pl
$VAR1 = bless( {
                 'status' => 5
               }, 'MyTest' );
Attribute (status) does not pass the type constraint because: Wrong
status: 10 at /System/Library/Perl/Extras/5.18/darwin-thread-multi-
2level/Moose/Exception.pm line 37

关于Moose的这一方面没有多少信息,但是看起来Moose::Util::TypeConstraints是折叠到Moose中的MooseX模块。

编辑删除胁迫!

你也需要一个明确的强制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40556316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档