Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl MooseX::AttributeHelpers和MooseX::FollowPBP是否正确交互?_Perl_Moose - Fatal编程技术网

Perl MooseX::AttributeHelpers和MooseX::FollowPBP是否正确交互?

Perl MooseX::AttributeHelpers和MooseX::FollowPBP是否正确交互?,perl,moose,Perl,Moose,以下代码定义了两个类(DeckA和DeckB),它们的区别仅在于是否使用随附的功能。Moose为DeckB生成的getter不是我所期望的。这是一个bug还是我误解了如何和应该进行交互 目前我的解决方法是避免在这种情况下使用is参数,而是根据需要声明读卡器和写卡器 use strict; use warnings; my %moose_args = ( isa => 'ArrayRef[Str]', is => 'ro', default

以下代码定义了两个类(
DeckA
DeckB
),它们的区别仅在于是否使用随附的功能。Moose为
DeckB
生成的getter不是我所期望的。这是一个bug还是我误解了如何和应该进行交互

目前我的解决方法是避免在这种情况下使用
is
参数,而是根据需要声明
读卡器
写卡器

use strict;
use warnings;

my %moose_args = (
    isa     => 'ArrayRef[Str]',
    is      => 'ro',
    default => sub {[]},
);

my %moose_attr_helper_args = (
    metaclass => 'Collection::Array',
    provides => {
        elements => 'get_all_cards',
    },
);

package DeckA;
use Moose;
use MooseX::FollowPBP;
use MooseX::AttributeHelpers;
has 'cards' => (%moose_args);

package DeckB;
use Moose;
use MooseX::FollowPBP;
use MooseX::AttributeHelpers;
has 'cards' => (%moose_args, %moose_attr_helper_args);

package main;
for my $class (qw(DeckA DeckB)){
    my $deck = $class->new;
    print "\n$class\n";
    for my $method ( qw(cards get_cards get_all_cards) ){
        print "$method: ", $deck->can($method) ? 'yes' : 'no', "\n";
    }
}
输出:

DeckA
cards: no
get_cards: yes
get_all_cards: no

DeckB
cards: yes          # Not what I expected.
get_cards: no       # Not what I expected.
get_all_cards: yes

当您为MX::AH使用元类选项时,它们不起作用


然而,最新的Moose集成了对本地助手的支持,并稍微调整了API。这个版本使用traits(一个应用于属性的角色),它应该可以与MX::FollowPBP一起工作。

我也有同样的问题,所以我非常感谢FM的问题和Dave Rolsky的回答

重新表述他的部分答案,以便我的简单自我在第一次阅读时就能理解:

您可以在最新版本的Moose中简单地使用“traits”,而不是使用MooseX::AttributeHelpers。这消除了与MooseX::FollowPBP的冲突,同时仍然提供相同的功能

有关使用特征的信息,请参见Moose::Meta::Attribute::Native


你抢先回答了我这个问题。。。诅咒你,戴夫·罗尔斯基。。。诅咒你