我开始意识到这适合初学者:
package Bad;
has 'arr' => ( is => 'rw', 'ArrayRef[Str]' );
package main;
my $bad = Bad->new(arr => [ "foo", "bar" ]);
print $bad->arr->[0], "\n";
输入特征。不过,我对 Traits API 并不感兴趣。我是否误解了什么?我可以以某种方式获得这个 API 吗? :
print $bad->arr->get(0), "\n";
Details
查看规范特征示例驼鹿::元::属性::本机::特征::数组 http://search.cpan.org/dist/Moose/lib/Moose/Meta/Attribute/Native/Trait/Array.pm
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);
所有方法都来自哪里驼鹿::元::属性::本机::特征::数组 http://search.cpan.org/dist/Moose/lib/Moose/Meta/Attribute/Native/Trait/Array.pm以类型安全的方式实现?
然后每个数组上的所有操作都以完全相同的方式命名......
(我实际上使用的是 Mouse,但 Mouse 的大部分与 Moose 相同)