Может кто-нибудь объяснить, как реализовать и использовать массивы частной области в Moops?
Я пытаюсь изучить Moops, и я не могу понять, как использовать заполнение и перебирать lexical_has arrayRefs. Можете ли вы продемонстрировать их использование здесь с кодом, пожалуйста?
Я написал следующее:
lexical_has people => (is => 'rw',
isa => ArrayRef,
default => sub { [] },
accessor => \(my @people),
required => 0);
Я попытался заполнить это так:
$self->$people[$counter](Employee->new()->dispatch());
Но это заставляет меня ошибаться "Синтаксическая ошибка рядом с $people[]"
1 ответ
Вы устанавливаете accessor => \@people
который показывает фундаментальное недопонимание того, что lexical_has
делает. lexical_has
устанавливает кодовую ссылку в эту переменную, поэтому она должна быть скалярной.
Итак, когда у вас есть $people
как скаляр, который lexical_has
установил coderef в, затем $self->$people()
или же $self->$people
это вызов метода, который возвращает arrayref. таким образом @{ $self->$people }
это сам массив (не ref), который вы можете использовать для push / pop / shift / unshift / grep / map / sort / foreach / и т.д.
Быстрый пример:
use Moops;
class GuestList {
lexical_has people => (
isa => ArrayRef,
default => sub { [] },
reader => \(my $people),
lazy => 1,
);
method add_person (Str $name) {
push @{ $self->$people }, $name;
}
method announce () {
say for @{ $self->$people };
}
}
my $list = GuestList->new;
$list->add_person("Alice");
$list->add_person("Bob");
$list->add_person("Carol");
$list->announce;
Выход:
Alice
Bob
Carol
Вот эквивалентный код, использующий открытый атрибут для people
...
use Moops;
class GuestList {
has people => (
is => 'ro',
isa => ArrayRef,
default => sub { [] },
lazy => 1,
);
method add_person (Str $name) {
push @{ $self->people }, $name;
}
method announce () {
say for @{ $self->people };
}
}
my $list = GuestList->new;
$list->add_person("Alice");
$list->add_person("Bob");
$list->add_person("Carol");
$list->announce;