我编写了一组类和接口,这些类和接口在驼鹿中也使用角色实现。我很难理解的是驼鹿性状和角色在使用和实现上的确切区别。
驼鹿文献指出:
重要的是要理解角色和特质是相同的。角色可以被用作一种特质,而特质就是一种角色。唯一区别两者的地方是,一个特征的包装方式可以让驼鹿将一个短名称解析为一个类名。换句话说,调用者可以使用"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发布于 2009-07-08 04:24:26
这是驼鹿使用“特质”和“角色”的唯一不同之处。驼鹿的文档和API经常使用“特性”一词作为“应用于元类的角色”。在您修改后的答案中,您的第一个示例通过-traits将角色应用于-traits的元类,第二个示例将其应用于类。
如果将第一个示例更改为:
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__->meta->foo();你会看到"foo at [script]. line 3.“,这正是它应该做的。
更新:很明显,我在这里做的不完全正确。特征是应用于实例的角色。-traits钩子将HasTable应用于MyApp::User的元类实例。我已经更新了相关的驼鹿文档。
发布于 2009-07-07 19:01:43
您不定义包含任何角色的包'x::Foo‘。从文档中直接撕开,我们看到register_implementation返回实际定义的包的名称:
package MyApp::Meta::Class::Trait::HasTable;
use Moose::Role;
has table => (
is => 'rw',
isa => 'Str',
);
package Moose::Meta::Class::Custom::Trait::HasTable;
sub register_implementation { 'MyApp::Meta::Class::Trait::HasTable' }
package MyApp::User;
use Moose -traits => 'HasTable';
__PACKAGE__->meta->table('User');“快捷方式”是通过Moose寻找"Moose::Meta::Class::Trait::$trait_name" (在“类上下文”中调用时)实现的,而不仅仅是传递一个较短的名称。
https://stackoverflow.com/questions/1093506
复制相似问题