Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Moose:类型库(MooseX::类型)_Perl_Moose - Fatal编程技术网

Perl Moose:类型库(MooseX::类型)

Perl Moose:类型库(MooseX::类型),perl,moose,Perl,Moose,我正试图找出将驼鹿纳入我的项目的正确方法。我发现一篇文章建议Moose类型应该组织在类型库中,这似乎是个好主意。因此,我根据提供的示例编写了以下代码: 文件1:MyTypeLib.pm package MyTypeLib; use MooseX::Types -declare => [ qw( MyStatus ) ]; use MooseX::Types::Moose qw/Int/; subtype MyStatus, as Int, where { $_ &

我正试图找出将驼鹿纳入我的项目的正确方法。我发现一篇文章建议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;
package MyTypeLib;
use Moose::Util::TypeConstraints;

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

#coerce MyStatus => from Int => via { $_ };
1;
文件3:MyMain.pl

use strict;
use warnings;
use MyTest;

my $t1 = MyTest->new('status' => 5);
当我运行它时,会收到以下消息:

属性(状态)未通过类型约束,因为: 在上验证值为5(不是isa MyStatus)的“MyStatus”失败 C:\草莓\perl\vendor\lib\Moose\Object.pm第24行

当我在MyTest.pm中保留子类型定义并且不使用MooseX::Types时,一切都按预期进行。但关键是将子类型移动到单独的包中,并在其他包中使用它们。 是否有人可以建议如何使其发挥作用,或指出(或张贴)一些工作示例,或建议实现目标的替代方法

谢谢大家!

这似乎有效

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;
package MyTypeLib;
use Moose::Util::TypeConstraints;

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

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

use strict;
use warnings;
use MyTest;

my $t1 = MyTest->new('status' => 5);
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模块折叠到Moose中的
Moose::Util::TypeConstraints


编辑 取消强制

你还需要一个明确的强制-


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

这同样有效,但与霍布斯的解决方案相比需要额外的步骤(强制)。不管怎样,知道其他选择是很好的。谢谢大家!@实际上,这里的强迫是不必要的,没有任何作用。但这仍然是一个“错误”的答案,因为它抛弃了你在类型库中所做的一切,取而代之的是stringy类型。@hobbs你是对的,不需要强制,我把它取出来了。但是,此版本不允许
MyStatus
保持未引用状态。“错误”的答案,但我会留在这里作为参考!关于这个话题有什么好的例子来源吗?来自CPAN的这个例子对于像子类型ArrayRefOffPositiveInt和ArrayRef[PositiveInt]这样的类型根本不起作用;如何定义这样的东西而不使其成为“stringy类型”?@而且它工作得很好。确保您已经实际导入了
ArrayRef
并定义了
PositiveInt
,如果它仍然不起作用,请询问另一个具体的问题。您是对的,我没有导入ArrayRef。我刚刚复制/粘贴了该示例:)