加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Moose角色中的方法名称冲突

发布时间:2020-12-16 06:24:33 所属栏目:大数据 来源:网络整理
导读:我想要实现的是创建一个导入多个角色的Moose类.这是我多年来一直在做的事情没有问题,但我目前仍然坚持为什么下面的简单示例会产生方法名称冲突. package logrole;use Moose::Role;use POSIX;use namespace::autoclean;package otherrole;use Moose::Role;use
我想要实现的是创建一个导入多个角色的Moose类.这是我多年来一直在做的事情没有问题,但我目前仍然坚持为什么下面的简单示例会产生方法名称冲突.

package logrole;

use Moose::Role;
use POSIX;
use namespace::autoclean;

package otherrole;

use Moose::Role;
use File::Temp;
use namespace::autoclean;

package myclass;

use Moose;
use namespace::autoclean;
with 'logrole','otherrole'; 

package main;

use strict;
use warnings;
use myclass;

运行这个给出:

Due to method name conflicts in roles 'logrole' and 'otherrole',the methods 'SEEK_CUR','SEEK_END',and 'SEEK_SET' must be implemented or excluded by 'myclass' at /home/user/perl5/perlbrew/perls/perl-5.22.1/lib/site_perl/5.22.1/x86_64-linux/Moose/Exporter.pm line 419
Moose::with('logrole','otherrole') called at roles.pl line 29

根据docs,你可以在使用这样的角色时排除方法名称:

package logrole;

use Moose::Role;
use POSIX;
use namespace::autoclean;

package otherrole;

use Moose::Role;
use File::Temp;
use namespace::autoclean;

package myclass;

use Moose;
use namespace::autoclean;
with 'logrole','otherrole' => { -excludes => ["SEEK_CUR","SEEK_END","SEEK_SET" ] };

package main;

use strict;
use warnings;
use myclass;

这解决了名称冲突,但是这个解决方案的问题是尝试在otherrole中导入POSIX会产生数百个名称冲突,因此在模块myclass中排除所有这些的修复似乎非常混乱.

如何导入(或写入)这些角色以避免方法名称冲突?

解决方法

namespace::autoclean不会删除方法,它信任 Class::MOP::Class的get_method_list来返回它们.令人困惑的是,它返回POSIX模块中的所有常量.

如果将namespace :: autoclean切换到namespace::clean,则问题就消失了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读