/ / Czy ktoś może wyjaśnić, jak zaimplementować i korzystać z prywatnych macierzy w Moops? - Perl, Łoś, Fosy

Czy ktoś może wyjaśnić, jak zaimplementować i wykorzystać prywatne macierze w Moops? - Perl, Łoś, Fosy

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 № 1

Ty 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;