由于您对相关数组进行了变异,因此您不希望引用您用作默认数组的数组 \@list ,你想要一个浅的副本 [@list] 。
\@list
[@list]
package t; use Moo; use Types::Standard qw(ArrayRef); my @list = qw/foo bar baz/; has list => ( is => 'rw', isa => ArrayRef, builder => default => sub { [@list] } ); package u; use Moo; use Types::Standard qw(ArrayRef); extends 't'; sub BUILD { my ($self) = @_; push @{$self->list()}, qw/apple banana/; return $self; } package main; use Data::Printer; my $u = u->new(); p $u->list(); my $t = t->new(); p $t->list();
虽然我在这里,但使用BUILD来修改属性是可能的,但不一定是最好的。你可以使用一个类似于惰性属性的东西和一个构建器方法,然后在子类ala中重载该方法
package t; use Moo; use Types::Standard qw(ArrayRef); my @list = qw/foo bar baz/; has list => ( is => 'rw', isa => ArrayRef, builder => '_build_list', lazy => 1, ); sub _build_list { my $self = shift; return [@list]; } package u; use Moo; extends 't'; sub _build_list { my $self = shift; my $list = $self->SUPER::_build_list(); push @$list, qw/apple banana/; return $list; } package main; use Data::Printer; my $u = u->new(); p $u->list(); my $t = t->new(); p $t->list();