首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moo:尝试重新加载角色中止

Moo:尝试重新加载角色中止
EN

Stack Overflow用户
提问于 2014-03-13 10:41:57
回答 1查看 1.8K关注 0票数 1

我有一个模块,它使用许多(独立的)模块,所有这些模块都具有相同的属性(本地化对象的句柄)。我没有将该属性添加到所有类中,而是将该属性移动到角色中,然后由所有顶级类使用该属性。

不幸的是,现在我得到了致命的错误“尝试重新加载‘角色’中止”+“编译失败在要求在模块/运行时行317”。

我已经做了双重和三次检查,我没有在所有的类中使用这个角色超过一次,但是对于如何解决这个问题和发现错误,我有点困惑。由于这在早期(在开始/开始之前)就失败了,所以现在(我知道)也有方法来调试它。

Moo类层次结构和消费看起来基本如下(这是发布所有内容的大量代码的方法,但仍然太多):

主类:

代码语言:javascript
复制
SwitchInfo.pm: use Foo::SwitchInfo::DeviceIdent;
SwitchInfo.pm: use Foo::SwitchInfo::Factory;
SwitchInfo.pm: use Foo::SwitchInfo::L10N;
SwitchInfo.pm: use Moo;

角色:

代码语言:javascript
复制
SwitchInfo/Role/L10N.pm: use Moo::Role;

一级的独立类:

代码语言:javascript
复制
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';

子类到第二级类:

代码语言:javascript
复制
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';

当尝试使用main类时,我得到以下错误:

代码语言:javascript
复制
$ 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的主管是(行号):

代码语言:javascript
复制
 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;

整个角色是这样的:

代码语言:javascript
复制
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;

一个小的测试脚本已经验证了在几个类中使用一个角色,然后在另一个类中使用这些类是没有问题的。

如果有人还在看这篇长篇文章,你会发现有什么问题吗?或者这个角色的使用是它应该使用的吗?这是我第一次(真正的)尝试使用一个角色,所以我可能已经越界了。

EN

回答 1

Stack Overflow用户

发布于 2014-03-13 11:44:26

发现了错误。结果,我在角色中的“句柄”指令中出现了一个错误。

代码语言:javascript
复制
handles => qw/ maketext /,

应该是

代码语言:javascript
复制
handles => [ qw/ maketext / ],

通过跑

代码语言:javascript
复制
perl -c lib/Foo/SwitchInfo/Role/L10N.pm

谁大声抱怨

代码语言:javascript
复制
Can't locate maketext.pm in @INC
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22376023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档