首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >驼鹿的角色和性格有何不同?

驼鹿的角色和性格有何不同?
EN

Stack Overflow用户
提问于 2009-07-07 16:55:07
回答 2查看 6.2K关注 0票数 21

我编写了一组类和接口,这些类和接口在驼鹿中也使用角色实现。我很难理解的是驼鹿性状和角色在使用和实现上的确切区别。

驼鹿文献指出:

重要的是要理解角色和特质是相同的。角色可以被用作一种特质,而特质就是一种角色。唯一区别两者的地方是,一个特征的包装方式可以让驼鹿将一个短名称解析为一个类名。换句话说,调用者可以使用"Big“这样的短名称来引用它,而Moose将把它解析为一个类,如MooseX::Embiggen::Meta::Attribute::Role::Big。

我的理解是,性格和角色是“相同的”。然而,当使用use Moose -traits 'Foo'语法实现基本的思想测试时,似乎并没有达到我预期的效果。我肯定是漏掉了什么。

第一个示例失败,“无法找到对象方法'foo'”

代码语言:javascript
运行
复制
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'

与此相比较(确实有效):

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-08 04:24:26

这是驼鹿使用“特质”和“角色”的唯一不同之处。驼鹿的文档和API经常使用“特性”一词作为“应用于元类的角色”。在您修改后的答案中,您的第一个示例通过-traits将角色应用于-traits的元类,第二个示例将其应用于类。

如果将第一个示例更改为:

代码语言:javascript
运行
复制
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的元类实例。我已经更新了相关的驼鹿文档。

票数 12
EN

Stack Overflow用户

发布于 2009-07-07 19:01:43

您不定义包含任何角色的包'x::Foo‘。从文档中直接撕开,我们看到register_implementation返回实际定义的包的名称:

代码语言:javascript
运行
复制
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" (在“类上下文”中调用时)实现的,而不仅仅是传递一个较短的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1093506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档