Próbuję nauczyć się Moopsa i nie mogę pojąć, jak korzystać z zapełniania i iterowania po tablicy leksykalnej. Czy możesz zademonstrować ich użycie tutaj za pomocą kodu?
Napisałem co następuje:
lexical_has people => (is => "rw",
isa => ArrayRef,
default => sub { [] },
accessor => (my @people),
required => 0);
Próbowałem to wypełnić:
$self->$people[$counter](Employee->new()->dispatch());
Ale ciągle się mylę. „Błąd składniowy w pobliżu> $ people []”
Odpowiedzi:
3 dla odpowiedzi № 1Ty ustawiasz accessor => @people
co pokazuje fundamentalne niezrozumienie tego, co lexical_has
robi. lexical_has
instaluje koderef do tej zmiennej, więc powinien to być skalar.
Więc, kiedy już to zrobisz $people
jako skalar, który lexical_has
następnie zainstalował kodera $self->$people()
lub $self->$people
to wywołanie metody, które zwraca arrayref. A zatem @{ $self->$people }
jest samą tablicą (nie-ref), której możesz użyć do push / pop / shift / unshift / grep / map / sort / foreach / etc.
Szybki przykład:
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;
Wynik to:
Alice
Bob
Carol
Oto równoważny kod używający atrybutu publicznego dla 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;