【问题标题】:Moose attributes - accepting multiple modules with common parentMoose 属性 - 接受具有共同父级的多个模块
【发布时间】:2013-12-07 22:09:51
【问题描述】:

需要做类似下一个(以及更多)的事情:

my $val1 = My::Module::Type1->new(...);
my $val2 = My::Module::Type2->new(...);

my $some = Some->new( val => [$val1, $val2] );

如何在Some 包中定义$val(基于Moose)?所以,

package Some;
use Moose;
has 'val' => (
    isa => 'ArrayRef[My::Module::__ANYTHING__HERE__]', # <-- here is the problem
);

问题是现在只有My::Module::Type1 但是如何构造Some-&gt;val 来接受任何未来的My::Module::_something_

我最好的主意是

use Moose;
use Moose::Util::TypeConstraints;
usa Scalar::Util qw( blessed );

subtype MySubModule,
    as Object => where {
         blessed $_ =~ /^My::Module/
    },
    message { "Need My::Module class" };

has val => ( is => 'rw', isa => 'ArrayRef[MySubModule]' );

但我认为这不是最好的方法,因为如果有人将Your::Module 设为My::Module 的子类会怎样?

谁能给我一些更正确的解决方案?

(可能需要在某种程度上合并角色(或特征),但是(老实说)- 仍然从未使用过任何角色- 并且不知道如何使用它们.. ;()

我希望以上内容可以理解 - 不幸的是,我的英语和我的 perl 一样糟糕.. ;(

【问题讨论】:

  • 这些都应该是My::Module的子类吗?因为如果他们是,isa 检查就是您所需要的。

标签: perl moose


【解决方案1】:

使用类类型约束。它尊重继承...

use Moose;
use Moose::Util::TypeConstraints;

class_type 'MyModule', { class => 'My::Module' };

has val => ( is => 'rw', isa => 'ArrayRef[MyModule]' );

或者更好(尽管请记住我有偏见)...

use Moose;
use Types::Standard -types;

has val => (is => 'rw', isa => ArrayRef[InstanceOf['My::Module']]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多