3

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

package MyMooseClass;
use Moose;

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

现在,我想像这样构建一个 MyMooseClass 的实例:

my $instance = MyMooseClass->new( { a => $a_non_moose_stuff } );

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

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

4

1 回答 1

5

最简单的事情是使用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并向下滚动一点,直到您看到Duke_type的条目。此约束是专门为处理此类问题而添加的。

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

顺便说一句,虽然支持在构造函数中使用哈希引用,并且在 Moose 被认为是最佳实践之前很长一段时间,我认识的大多数 Moose 作者都跳过它,只提供构造函数参数列表。在我看来,它的打字少了一点,看起来更干净了:

my $instance = MyClass->new(param1=>'val1', param2=>'val2');

Hash Reference 方法的主要目的是帮助解决一些在使用 Moose 构建 Perl 对象时真正不会发生的歧义。由于 Moose 会为您处理所有这些样板文件和仪式,我认为这是不必要的,尽管风格确实有所不同。我的两分钱。

别紧张,

约翰

于 2010-08-31T12:51:22.340 回答