Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.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一起使用别名不';声明类时似乎不起作用_Perl_Perl Module_Moose - Fatal编程技术网

Perl 与Moose一起使用别名不';声明类时似乎不起作用

Perl 与Moose一起使用别名不';声明类时似乎不起作用,perl,perl-module,moose,Perl,Perl Module,Moose,我对Perl有点陌生。我试图以以下方式定义/使用类: package A::B::C; use strict; use warnings; use Moose; use aliased 'A::B::D'; has 'attribute' => (isa => 'ArrayRef[D]', is => 'ro', required => 1); 创建对象时: use aliased 'A::B::C'; use aliased 'A::B::D'; my $aref =

我对Perl有点陌生。我试图以以下方式定义/使用类:

package A::B::C;
use strict;
use warnings;
use Moose;
use aliased 'A::B::D';
has 'attribute' => (isa => 'ArrayRef[D]', is => 'ro', required => 1);
创建对象时:

use aliased 'A::B::C';
use aliased 'A::B::D';
my $aref = [D->new()];
C->new($aref);
然而,由于驼鹿抱怨说:

Attribute (attribute) does not pass the type constraint because: Validation failed for 'ArrayRef[D]' with value ARRAY(0x7f2b658b51c0)
但是,如果我切换到不使用别名,它会起作用(当然应该是这样):

我的问题是为什么使用别名位对Moose不起作用


谢谢

驼鹿不知道
使用别名
。pragma
使用别名
是对Perl的一种攻击;它所做的只是创建一个具有短名称的子例程,该子例程返回类名。所以

use aliased 'A::B::D';
相当于

use A::B::D;

sub D() { 'A::B::D' }
(见附件)

然后,当您说类似于
D->new()
的话时,Perl注意到有一个名为
D
的子例程(常量),并将
D
解释为子例程调用,然后对结果进行方法调用。(而不是像通常那样将
D
解释为字符串常量)。即使对Perl来说,
D
也不是真正的包名;只是一些像包名一样的东西

此外,Moose有自己的类型声明解析系统(这就是为什么您可以像以前一样将它们作为字符串提供的原因)和自己的类型声明全局概念。所有这些都不知道别名是什么,所以Moose使用默认行为将未识别的类型视为(全局)包名

如果您了解别名的工作原理,您可以通过

has 'attribute' => (isa => 'ArrayRef['.D.']', is => 'ro', required => 1);
但最好记住这一点

或者使用完全限定的包名作为处处的类型,或者使用并写入

package A::B::C;

use Moose;

use aliased 'A::B::D';

use Types::Standard qw/ ArrayRef /;
use Type::Utils qw( class_type );

has 'attribute' => (isa => ArrayRef[class_type D], is => 'ro', required => 1);
(请注意,
D
周围缺少引号,这可能是因为
使用别名
!)


(<代码>类型:Simult可能会比驼鹿类型快,所以你可能还是要考虑它)。

这是对进口使用短名称的标准/推荐方式吗?我想要确保的是,我最终使用的方法没有任何与之相关联的gotchas,只是在用作指定整个路径的替代方法时才起作用。
package A::B::C;

use Moose;

use aliased 'A::B::D';

use Types::Standard qw/ ArrayRef /;
use Type::Utils qw( class_type );

has 'attribute' => (isa => ArrayRef[class_type D], is => 'ro', required => 1);