我编写了一组在Moose中也使用角色实现的类和接口。我难以理解的是 Moose 特征与角色在使用和实现方面的确切差异。
Moose 文档指出:
重要的是要了解角色和特征是一回事。角色可以用作特质,特质就是角色。区分这两者的唯一一点是,一个 trait 以一种允许 Moose 将短名称解析为类名的方式打包。换句话说,对于一个 trait,调用者可以通过一个短名称来引用它,比如“Big”,Moose 会将它解析为一个类,比如 MooseX::Embiggen::Meta::Attribute::Role::Big。
我的理解是特征和角色是“相同的”。但是,当使用语法对想法进行基本测试时,use Moose -traits 'Foo'
似乎并没有达到我的预期。当然,我必须在这里遗漏一些东西。
第一个示例因“无法定位对象方法 'foo'”而失败
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->foo(); #Can't locate object method 'foo'
与这个(确实有效)相比:
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
sub foo { warn 'foo' }
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose;
with 'MyApp::Meta::Class::Trait::HasTable';
__PACKAGE__->foo(); #foo