Я нуждаюсь в руководстве. В последнее время я переключил свой образ жизни на Moose. В целом, я обнаружил, что лоси делает жизнь намного интереснее и веселее. В то же время я до сих пор не дошел до такой степени, что я чувствую себя более продуктивным ... возможно, потому что я все время теряю себя в абстракции и до сих пор недостаточно изучил, чтобы иметь возможность эффективно анализировать документы лося, чтобы знать, что другие умные люди уже решили. Я сделал нулевое программирование OO до того, как лос вошел в мою жизнь.Как распределить атрибут между несколькими объектами Moose?
Вот мой вопрос: существует ли простой способ совместного использования атрибута (той же ячейки памяти) между объектами? Это плохая практика? В приведенном ниже примере AoA я использую атрибут AoA icol для доступа к тому, что я хочу в базовом массиве. Другой подход заключается в том, чтобы атрибут i и и icol ссылался на одно и то же значение (измените его и измените все). Я склоняюсь к решению ниже, потому что это кажется более ясным, но я был бы очень признателен, если бы кто-нибудь посмотрел на него и помог мне улучшить мое мышление. Другой вопрос: мне нужно установить дескрипторы для атрибута ents в классе MyArray? Я пробовал комментировать и потерял эти методы.
{
package AoA;
use namespace::autoclean;
use Moose;
has [qw(icol irow)] => (
is => 'rw',
isa => 'Int',
default => 0,
);
has 'rows' => (
traits => ['Array'],
is => 'rw',
isa => 'ArrayRef',
default => sub { [] },
handles => {
add_row => 'push',
get_row => 'get',
set_row => 'set',
all_rows => 'elements',
count_rows => 'count',
},
);
sub get_element {
my $self = shift;
@_ == 2 ?
return $self->get_row($_[0])->get($_[1]) :
return $self->get_row($self->irow)->get($self->icol);
}
sub add_col {
my $self=shift;
my $nrows = $self->count_rows-1;
foreach my $i (0 .. $nrows){
$_[$i] ? $self->rows->[$i]->push($_[$i]) : $self->rows->[$i]->push(undef);
}
}
sub get_col {
my $self = shift;
my $icol = shift || $self->icol;
my $nrows = $self->count_rows-1;
my @column;
foreach (0 .. $nrows){
my $row = $self->get_row($_);
$icol <= $row->count ? push @column, $row->get($icol): push @column, undef;
}
return \@column;
}
__PACKAGE__->meta->make_immutable;
}
{
package MyArray;
use namespace::autoclean;
use Moose;
has 'i' => (
is => 'rw',
isa => 'Int',
default => 0,
);
has 'ents' => (
traits => ['Array'],
is => 'rw',
isa => 'ArrayRef',
default => sub { [] },
handles => {
push => 'push',
get => 'get',
set => 'set',
elements => 'elements',
count => 'count',
},
);
__PACKAGE__->meta->make_immutable;
}
use Modern::Perl;
my $a0 = MyArray->new(ents => [ 0, [ 0, 0, 0 ], [1,2,3] ]) ;
my $a1 = MyArray->new(ents => [ 1, [ 1, 1, 1 ], [4,5,6] ]) ;
my $a2 = MyArray->new(ents => [ 2, [ 2, 2, 2 ], [7,8,9] ]) ;
my $a = AoA->new(rows => [ $a0, $a1]) ;
$a->add_row($a2);
$a->add_col([3,3,3],[4,4,4],[5,5,5]);
my $row0 = $a->get_row(0);
my $row1 = $a->get_row(1);
my $row2 = $a->get_row(2);
my $element_22 = $a->get_element(2,2);
my $col2 = $a->get_col(1);
use Data::Dumper;
print Dumper $row0;
print Dumper $row1;
print Dumper $row2;
print Dumper $col2;
print Dumper $element_22;
$a0->set(0,'cat');
print Dumper $row0;
1;
's {life} {coding} gi'? – Zaid
Я надеялся, что добавленная драма поможет людям читать! – Demian