gpt4 book ai didi

Perl 类的属性组成?

转载 作者:行者123 更新时间:2023-12-04 04:16:12 25 4
gpt4 key购买 nike

假设我有多个角色,每个角色定义一组项目:

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“不是很稳定”,并且“当前的实现有点像 hack,应该被更健壮的替代”。因此,我正在调查这是否可以在不依赖这种“黑客”的情况下完成。

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

理想情况下应该是这样的: my @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;
...
}

最佳答案

您需要使用 around :

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, $self, @args) = @_;
return ($self->$orig(@args), qw/watermelon/);
};

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

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

但总的来说,使用类来表示数据是错误的,就是这样
类的实例用于。由于您的示例非常琐碎,因此很难提供进一步的建议。你真正想做什么?

关于Perl 类的属性组成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4850464/

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