假设你有一个Moose类需要一个具有一个角色的属性:
package MyMooseClass;
use Moose;
has 'a' => ( does => 'MyRole' );
Run Code Online (Sandbox Code Playgroud)
现在,我想构建一个MyMooseClass实例,如下所示:
my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );
Run Code Online (Sandbox Code Playgroud)
其中$ a_non_moose_stuff是非驼鹿类的实例,但实现了所需的角色方法.
有没有办法让Moose检查我的$ a_non_moose_stuff是否符合该角色,即使它没有使用Moose实现?
小智 5
最简单的方法是使用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/),
);
Run Code Online (Sandbox Code Playgroud)
请参阅Moose :: Util :: TypeConstraints并向下滚动一下,直到看到duck_type的条目.这个约束是专门为处理这类问题而添加的.
如果要重复使用此约束,您可能希望在类库库类中创建它,这将促进重用.查看MooseX :: Types.
顺便说一句,虽然支持在构造函数中使用哈希引用,并且在Moose认为是最佳实践之前的很长一段时间,我知道的大多数Moose作者跳过它并只提供构造函数参数列表.在我看来,它的打字更少,看起来更干净:
my $instance = MyClass->new(param1=>'val1', param2=>'val2');
Run Code Online (Sandbox Code Playgroud)
哈希参考方法的要点是帮助解决在使用Moose构建Perl对象时真正不会发生的一些歧义.由于Moose为您处理所有的样板和仪式,我认为这是不必要的,尽管样式确实有所不同.我的两分钱.
别紧张,
约翰