我有一个使用多个(独立)模块的模块,所有这些模块都具有相同的属性(本地化对象的句柄)。我没有将该属性添加到所有类,而是将该属性移动到一个角色,然后由所有顶级类使用。
不幸的是,现在我收到致命错误“尝试重新加载'角色'中止”+“在模块/运行时第 317 行的要求中编译失败”。
我已经双重和三重检查了我在所有课程中没有多次使用角色,但是对于如何解决问题并找到错误有点难过。由于这很早就失败了(在 BEGIN 之前/之前),现在也有办法(我知道)来调试它。
Moo 类层次结构和消耗看起来基本上是这样的(发布所有内容的代码很多,而且仍然太多):
主类:
SwitchInfo.pm: use Foo::SwitchInfo::DeviceIdent;
SwitchInfo.pm: use Foo::SwitchInfo::Factory;
SwitchInfo.pm: use Foo::SwitchInfo::L10N;
SwitchInfo.pm: use Moo;
角色:
SwitchInfo/Role/L10N.pm: use Moo::Role;
第一级独立课程:
SwitchInfo/L10N: use base 'Locale::Maketext';
SwitchInfo/StackTable.pm: use Moo;
SwitchInfo/StackTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/DeviceIdent.pm: use Moo;
SwitchInfo/DeviceIdent.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/NameTable.pm: use Moo;
SwitchInfo/NameTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/Factory.pm: use Moo;
SwitchInfo/Factory.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/AliasTable.pm: use Moo;
SwitchInfo/AliasTable.pm: with 'Foo::SwitchInfo::Role::L10N';
SwitchInfo/Domain.pm: use Moo;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::AliasTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::NameTable;
SwitchInfo/Driver.pm: use Foo::SwitchInfo::StackTable;
SwitchInfo/Driver.pm: use Moo;
SwitchInfo/Driver.pm: with 'Foo::SwitchInfo::Role::L10N';
子类到二级类:
SwitchInfo/Driver/Cisco.pm: use Moo;
SwitchInfo/Driver/Cisco.pm: extends 'Foo::SwitchInfo::Driver';
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Domain;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::NameTable;
SwitchInfo/Driver/Extreme.pm: use Foo::SwitchInfo::Driver::Extreme::StackTable;
SwitchInfo/Driver/Extreme.pm: use Moo;
SwitchInfo/Driver/Extreme.pm: extends 'Foo::SwitchInfo::Driver';
SwitchInfo/Driver/Extreme/StackTable.pm: use Moo;
SwitchInfo/Driver/Extreme/StackTable.pm: extends 'Foo::SwitchInfo::StackTable';
SwitchInfo/Driver/Extreme/NameTable.pm: use Moo;
SwitchInfo/Driver/Extreme/NameTable.pm: extends 'Foo::SwitchInfo::NameTable';
尝试使用主类时出现以下错误:
$ cat sw.pl
use strict;
use warnings;
use lib './lib';
use Foo::SwitchInfo;
$
$ perl sw.pl
Attempt to reload Foo/SwitchInfo/Role/L10N.pm aborted.
Compilation failed in require at /opt/perl5/lib/perl5/Module/Runtime.pm line 317.
Compilation failed in require at lib/Foo/SwitchInfo.pm line 3.
BEGIN failed--compilation aborted at lib/Foo/SwitchInfo.pm line 3.
Compilation failed in require at sw.pl line 5.
BEGIN failed--compilation aborted at sw.pl line 5.
$
Foo/SwitchInfo.pm 的头部是(带有行号):
1 package Foo::SwitchInfo;
2
3 use Foo::SwitchInfo::DeviceIdent;
4 use Foo::SwitchInfo::Factory;
5 use Foo::SwitchInfo::L10N;
6 use Types::Standard qw/ ArrayRef InstanceOf Str /;
7 use Type::Utils qw/ as coerce declare from via /;
8
9 use Foo::SNMP;
10
11 use Moo;
12 use namespace::clean;
完整的角色是这样的:
package Foo::SwitchInfo::Role::L10N;
use Types::Standard qw/ InstanceOf /;
use Moo::Role;
has l10n => (
is => 'ro',
isa => InstanceOf['Foo::SwitchInfo::L10N'],
handles => qw/ maketext /,
required => 1,
);
1;
一个小测试脚本验证了在多个类中使用一个角色,然后在另一个类中使用这些类是没有问题的。
如果还有人在看这篇长文,你发现有什么问题吗?或者这种角色的使用是否应该用于它?这是我第一次(真正)尝试使用角色,所以我可能在这里越界了。