Moose 角色中的方法名称冲突
Method name conflicts in Moose roles
我想要实现的是创建一个导入多个角色的 Moose class。这是我多年来一直在做的事情,没有出现任何问题,尽管我目前仍然不明白为什么下面的简单示例会产生方法名称冲突。
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 doesn't remove methods, and it trusts Class::MOP::Class 的 get_method_list
到 return 他们。令人困惑的是,它 return 是 POSIX 模块中的所有常量。
如果将 namespace::autoclean
切换为 namespace::clean,问题就消失了。
我想要实现的是创建一个导入多个角色的 Moose class。这是我多年来一直在做的事情,没有出现任何问题,尽管我目前仍然不明白为什么下面的简单示例会产生方法名称冲突。
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 doesn't remove methods, and it trusts Class::MOP::Class 的 get_method_list
到 return 他们。令人困惑的是,它 return 是 POSIX 模块中的所有常量。
如果将 namespace::autoclean
切换为 namespace::clean,问题就消失了。