gpt4 book ai didi

perl - Moose 的角色和特征有何不同?

转载 作者:行者123 更新时间:2023-12-03 11:58:46 29 4
gpt4 key购买 nike

我编写了一组在 Moose 中实现的类和接口(interface)。也使用角色。我难以理解的是 Moose 特征与角色在使用和实现方面的确切差异。

Moose documentation状态:

It is important to understand that roles and traits are the same thing. A role can be used as a trait, and a trait is a role. The only thing that distinguishes the two is that a trait is packaged in a way that lets Moose resolve a short name to a class name. In other words, with a trait, the caller can refer to it by a short name like "Big", and Moose will resolve it to a class like 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

最佳答案

这是 Moose 使用术语“特征”和“角色”的唯一区别。
Moose 的文档和 API 经常使用术语“特征”作为“应用的角色”
到元类”。在您修改后的答案中,您的第一个示例将角色应用于MyApp::User的元类通过 -traits ,第二个示例将其应用于
类(class)。

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

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钩子(Hook)将 HasTable 应用于 MyApp::User 的元类实例。我已经更新了相关的 Moose 文档。

关于perl - Moose 的角色和特征有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1093506/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com