加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl类的属性组成?

发布时间:2020-12-15 23:26:36 所属栏目:大数据 来源:网络整理
导读:假设我有多个角色,每个角色定义一组项目: package A;use Moose::Role;sub items () { qw/apple orange/ }package B;use Moose::Role;with 'A';sub items () { qw/watermelon/ }package C;use Moose::Role;sub items () { qw/banana/ } 假设我在另一个类中使
假设我有多个角色,每个角色定义一组项目:

package A;
use Moose::Role;
sub items () { qw/apple orange/ }

package B;
use Moose::Role;
with 'A';
sub items () { qw/watermelon/ }

package C;
use Moose::Role;
sub items () { qw/banana/ }

假设我在另一个类中使用它们,我想收集所有这些项目:

package Foo;
use Moose;
with qw(B C);

sub do_something {
    my $self = shift;
    my @items = ???;   # How can I get apple,orange,watermelon,banana here?
    ....
}

一种可能的解决方案是采用MooseX::ComposedBehavior,但它的POD说(当然在撰写本文时)它的API“不太稳定”,而且“当前的实现是一种破解,应该被更多的东西取代健壮的“.因此,我正在调查这是否可以在不依赖于这种“黑客”的情况下完成.

警告:如果您将来阅读此内容,请查看MooseX::ComposedBehavior的POD(当前版本:0.003),因为它可能在平均时间内发生了变化.事情变化很快. CPAN作者发布了新版本.目前“不太稳定”的东西可能在未来变得更加稳定.甚至可能还有其他模块.自行检查.

理想情况下应该有类似的东西:我的@items = map $_-> items,@ISA;
然而,这对Moose不起作用.有没有更好,更可靠的解决方案?

更新:我最终得到了这个三线解决方案:

package A;
use Moose::Role;
sub items () { qw/apple orange/ }

package B;
use Moose::Role;
with 'A';
sub items () { qw/watermelon/ }

package C;
use Moose::Role;
sub items () { qw/banana/ }

package Foo;
use Moose;
with qw(B C);
sub items () {}

sub do_something {
    my $self = shift;

    my @items = map $_->execute,grep $_,map $_->get_method('items'),$self->meta->calculate_all_roles_with_inheritance;

    ...
}

更新:由于不同的人在#moose IRC channel中请求我,我删除了我之前的断言,即MooseX :: ComposedBehavior“不稳定”并将其替换为从其POD中获取的文字.

更新:我写了一个MooseX::Collect模块,它允许以下语法:

package Foo;
use Moose;
use MooseX::Collect;

collect 'items';
with qw(B C);

sub do_something {
    my $self = shift;
    my @items = $self->items;
    ...
}

解决方法

你需要使用:

package A;
use Moose::Role;
requires 'items';
around items => sub {
    my ($orig,$self,@args) = @_;
    return ($self->$orig(@args),qw/apple orange/);
};

package B;
use Moose::Role;
requires 'items';
with 'A'; # not required,do it if you want it
around items => sub {
    my ($orig,qw/watermelon/);
};

package C;
use Moose::Role;
requires 'items';
around items => sub {
    my ($orig,qw/banana/);
};

package Class;
use Moose;
with qw/B C/;
sub items {}

但一般来说,使用类来表示数据是错误的,那就是这样类的实例是为.很难提供进一步的建议,因为你的例子如此繁琐.你真的想做什么?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读