perl - Moose:如何获取对象数组?特质?

标签 perl moose

我开始意识到这是为初学者准备的:

package Bad;

has 'arr' => ( is => 'rw', 'ArrayRef[Str]' );

package main;

my $bad = Bad->new(arr => [ "foo", "bar" ]);
print $bad->arr->[0], "\n";

输入特征。不过,我对特征 API 感到不知所措。我误解了什么吗?我能以某种方式获得这个 API 吗? :
print $bad->arr->get(0), "\n";

细节

查看 Moose::Meta::Attribute::Native::Trait::Array 中的规范特征示例
package Stuff;
use Moose;

has 'options' => (
    traits  => ['Array'],
    is      => 'ro',
    isa     => 'ArrayRef[Str]',
    default => sub { [] },
    handles => {
        all_options    => 'elements',
        add_option     => 'push',
        map_options    => 'map',
        filter_options => 'grep',
        find_option    => 'first',
        get_option     => 'get',
        join_options   => 'join',
        count_options  => 'count',
        has_options    => 'count',
        has_no_options => 'is_empty',
        sorted_options => 'sort',
    },
);

no Moose;
1;

使用这样声明的对象,例如:
my $option = $stuff->get_option(1);

对于我获得的一个数组属性,我真的不喜欢这样,并且必须在我的 Stuff 类中手动命名 11 个方法——一个可以对“选项”执行的每一个操作。不一致的命名必然会发生,而且很臃肿。

我如何(优雅地)获得如下 API:
my $option = $stuff->options->get(1);

Moose::Meta::Attribute::Native::Trait::Array 中的所有方法以类型安全的方式实现?

然后每个 Array 上的所有操作都以完全相同的方式命名......

(我实际上使用的是鼠标,但大多数鼠标与 Moose 相同)

最佳答案

我认为让你的 API 变成这种格式的最好方法是为选项创建一个新对象,并将方法直接委托(delegate)给它。就像是:

package Stuff;
use Moose;
use Stuff::Options;

has 'options' => (
    'is'      => "ro",
    'isa'     => "Stuff::Options",
    'default' => sub { Stuff::Options->new },
);

no Moose;
1;

然后在 Stuff/Options.pm :
package Stuff::Options;
use Moose;

has '_options' => (
    'is'      => "ro",
    'isa'     => "ArrayRef[Str]",
    'traits'  => [ "Array" ],
    'default' => sub { [] },
    'handles' => [ qw(elements push map grep first get join count is_empty sort) ],
);

no Moose;
1;

这将允许您的示例中的代码工作( $stuff->options->get(1) )。

关于perl - Moose:如何获取对象数组?特质?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28094959/

相关文章:

windows - #!/usr/bin/perl 不需要在 Windows 中运行 perl,但是

java - Perl/Java 字节编码差异

perl - Moose,避免明确的样板

perl - 在5.6.x之后不赞成使用Perl的-w开关来警告吗?

perl - 使用 Perl-Mechanize : finalizing a little programme 进行 Dom 处理

perl - Bread::Board - 注入(inject)带有 ArrayRef 类型约束的参数?

perl - 如何从 Moose 包中导出子例程?

perl - 如何模拟 Moose 对象?

perl - 如何将 Moose 对象转换为 JSON 以在 Catalyst 中使用?

perl - 使用带有 CODE 引用的 Apache::Session 存储 Moose 对象的替代方法