假设您有一个Moose类,它需要一个执行角色的属性:
package MyMooseClass;
use Moose;
has 'a' => ( does => 'MyRole' );现在,我想构建一个MyMooseClass实例,如下所示:
my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );其中$a_non_moose_stuff是一个非驼鹿类的实例,但它实现了所需的角色方法。
有没有办法让Moose检查我的$a_non_moose_stuff是否符合角色,即使它不是用Moose实现的?
发布于 2010-08-31 20:51:22
最简单的方法是使用duck_type而不是角色来验证您的界面。duck_type是一种更宽松的限制,基本上duck_type只是对象期望拥有的方法的列表。例如:
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作者都跳过了这一步,只提供了构造函数参数的列表。在我看来,它的打字更少,看起来更整洁:
my $instance = MyClass->new(param1=>'val1', param2=>'val2');Hash引用方法的主要目的是帮助解决在使用Moose构造Perl对象时实际上不会发生的一些歧义。既然Moose为你处理了所有的样板和仪式,在我看来,这是不必要的,尽管风格确实不同。我的两点意见。
别紧张,
约翰
https://stackoverflow.com/questions/3607567
复制相似问题