首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >针对非Moose类检查Moose角色

针对非Moose类检查Moose角色
EN

Stack Overflow用户
提问于 2010-08-31 17:09:13
回答 1查看 306关注 0票数 3

假设您有一个Moose类,它需要一个执行角色的属性:

代码语言:javascript
运行
复制
package MyMooseClass;
use Moose;

has 'a' => ( does => 'MyRole' );

现在,我想构建一个MyMooseClass实例,如下所示:

代码语言:javascript
运行
复制
my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );

其中$a_non_moose_stuff是一个非驼鹿类的实例,但它实现了所需的角色方法。

有没有办法让Moose检查我的$a_non_moose_stuff是否符合角色,即使它不是用Moose实现的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-31 20:51:22

最简单的方法是使用duck_type而不是角色来验证您的界面。duck_type是一种更宽松的限制,基本上duck_type只是对象期望拥有的方法的列表。例如:

代码语言:javascript
运行
复制
package MyMooseClass;
use Moose;
use Moose::Util::TypeConstraints qw/duck_type/;

has 'a' => (
  isa => duck_type(qw/method1 method1 some_other_method/),
);

查看Moose::Util::TypeConstraints并向下滚动,直到您看到duck_type的条目。这个约束是专门为处理这类问题而添加的。

如果您打算大量重用此约束,则可能需要考虑在类型库类中创建它,这将促进重用。查看MooseX::Types

顺便说一句,尽管在构造函数中使用Hash引用是受支持的,而且在Moose之前很长一段时间都被认为是最佳实践,但我认识的大多数Moose作者都跳过了这一步,只提供了构造函数参数的列表。在我看来,它的打字更少,看起来更整洁:

代码语言:javascript
运行
复制
my $instance = MyClass->new(param1=>'val1', param2=>'val2');

Hash引用方法的主要目的是帮助解决在使用Moose构造Perl对象时实际上不会发生的一些歧义。既然Moose为你处理了所有的样板和仪式,在我看来,这是不必要的,尽管风格确实不同。我的两点意见。

别紧张,

约翰

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

https://stackoverflow.com/questions/3607567

复制
相关文章

相似问题

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