【问题标题】:Checking a Moose role against a non Moose class对照非 Moose 类检查 Moose 角色
【发布时间】:2010-09-01 03:11:25
【问题描述】:

假设你有一个 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 实现的?

【问题讨论】:

    标签: perl roles moose


    【解决方案1】:

    最简单的方法是使用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

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

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

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

    放轻松,

    约翰

    【讨论】:

    • 谢谢!正是我需要的。也许我什至可以将 Role 变成 ductype :)
    • 是的,duck_type 被添加为一种无需在 CPAN 上分叉和子类非 Moose 类的廉价方式,因此可以针对某些 API 进行检查。 (编辑:我需要学习阅读。)
    猜你喜欢
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多