Perl 与Moose一起使用别名不';声明类时似乎不起作用
我对Perl有点陌生。我试图以以下方式定义/使用类: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 =
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);