gpt4 book ai didi

perl - 针对非 Moose 类检查 Moose 角色

转载 作者:行者123 更新时间:2023-12-01 11:58:47 27 4
gpt4 key购买 nike

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

最佳答案

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

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

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

Hash Reference 方法的要点是帮助解决一些在使用 Moose 构造 Perl 对象时实际上不会发生的歧义。由于 Moose 为您处理了所有样板文件和仪式,因此在我看来这是不必要的,尽管样式确实有所不同。我的两分钱。

放轻松,

约翰

关于perl - 针对非 Moose 类检查 Moose 角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3607567/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com