我写了一组类和接口,这些类和接口在Moose中也使用角色实现。我无法理解的是驼鹿特征与角色的使用和实现的确切区别。驼鹿的角色和性状如何不同?
理解角色和特征都是一样的东西是很重要的。角色可以用作特质,特质是角色。唯一区别两者的是,特质是以一种让穆斯将短名称解析为类名的方式打包的。换句话说,对于一个特质,调用者可以通过一个简短的名称来引用它,比如“Big”,并且Moose会将它解析为像MooseX :: Embiggen :: Meta :: Attribute :: Role :: Big这样的类。
这是我的理解,特质和角色是“相同的”。但是,在使用use Moose -traits '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
谢谢,这解释了我所看到的行为。 – Danny 2009-07-08 13:40:55