Perl类的属性组成?
假设我有多个角色,每个角色定义一组项目:
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; 更新:我最终得到了这个三线解决方案: 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 {} 但一般来说,使用类来表示数据是错误的,那就是这样类的实例是为.很难提供进一步的建议,因为你的例子如此繁琐.你真的想做什么? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |