我正试图找出适当的方法,将驼鹿纳入我的项目。这里 --我发现了一篇文章,建议Moose类型应该组织在类型库中,这似乎是个好主意。因此,我根据提供的示例编写了以下代码:
文件1: MyTypeLib.pm
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
package MyTest;
use MyTypeLib qw( MyStatus );
use Moose;
has status => ( is => 'rw', isa => 'MyStatus' );
no Moose; 1;文件3: MyMain.pl
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时,一切都按预期工作。但重点是将子类型移动到单独的包中,并在其他包中使用它们。请有人建议如何使它工作,或指向(或张贴)一些工作的例子,或建议实现目标的替代方式。
谢谢!
发布于 2016-11-12 05:35:00
删除引号:isa => MyStatus,而不是isa => 'MyStatus'。MyStatus是从类型库导出的类似常量的函数.为isa提供一个字符串而不是一个适当的类型约束("stringy“)会导致在Moose的类型注册中心中查找它,或者,如果在那里找不到它,它就被解释为一个类的名称,并且该类型被推断为”该类的任何对象或它的子类“。与使用实际类型相比,字符串类型不那么显着,也不那么灵活,而且更容易发生冲突,因为它们都共享全局命名空间。最好不要同时使用它们和输入lbraries。
发布于 2016-11-12 05:26:08
这似乎很管用
MyTypeLib.pm
package MyTypeLib;
use Moose::Util::TypeConstraints;
subtype MyStatus =>
as 'Num' =>
where { $_ >= 0 && $_ < 10 },
message { "Wrong status: $_" };
#coerce MyStatus => from Int => via { $_ };
1;MyTest.pm
package MyTest;
use MyTypeLib;
use Moose;
has status => ( is => 'rw',
isa => 'MyStatus',
#coerce => 1 i
);
no Moose; 1;MyMain.pl
use strict;
use warnings;
use MyTest;
use Data::Dumper;
my $t1 = MyTest->new( status => 5);
print Dumper $t1;
my $t2 = MyTest->new( status => 10);这给
$ 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模块。
编辑删除胁迫!
你也需要一个明确的强制。
https://stackoverflow.com/questions/40556316
复制相似问题