Moose数组属性:我如何使用set方法?

cap*_*fan 3 arrays perl moose traits

我想将一个数组定义为一个类的属性,并在实例化类时用一些数据填充它.

我认为可以使用$self->attribute->set($id, $value)方法来设置给定索引上的元素.至少这是我从Moose 文档中理解的内容.

但是,当我尝试

use Data::Dumper qw( Dumper );
use Moose;

has cells => (
    is => 'rw',
    traits  => ['Array'],
    isa     => 'ArrayRef',
    default => sub { [] },
);

my $app = __PACKAGE__->new();
$app->cells->set($_, $_) for 0..3;
print(Dumper($app->cells));
Run Code Online (Sandbox Code Playgroud)

我明白了

Can't call method "set" on unblessed reference
Run Code Online (Sandbox Code Playgroud)

我该怎么办set

ike*_*ami 6

use Data::Dumper qw( Dumper );
use Moose;

has cells => (
    is => 'rw',
    traits  => ['Array'],
    isa     => 'ArrayRef',
    default => sub { [] },
    handles => {                   # <---
       set_cell => 'set',          # <---
    },                             # <---
);

my $app = __PACKAGE__->new();
$app->set_cell($_, $_) for 0..3;   # <---
print(Dumper($app->cells));
Run Code Online (Sandbox Code Playgroud)

尽管在评论中声称相反,但它也可以正常工作BUILD.

use Data::Dumper qw( Dumper );
use Moose;

has cells => (
    is => 'rw',
    traits  => ['Array'],
    isa     => 'ArrayRef',
    default => sub { [] },
    handles => {
       set_cell => 'set',
    },
);

sub BUILD {
    my ($self) = @_;
    $self->set_cell($_, $_) for 0..3;
}

my $app = __PACKAGE__->new();
print(Dumper($app->cells));
Run Code Online (Sandbox Code Playgroud)