/ / Qualcuno può spiegare come implementare e utilizzare array con ambito privato in Moops? - perl, alci, moops

Qualcuno può spiegare come implementare e utilizzare array con ambito privato in Moops? - perl, alci, moops

Sto cercando di imparare Moops e non riesco a capire come usare populate e iterare su lexical_has arrayRefs. Puoi dimostrare il loro utilizzo qui con il codice, per favore?

Ho scritto quanto segue:

lexical_has people => (is => "rw",
isa => ArrayRef,
default => sub { [] },
accessor => (my @people),
required => 0);

Ho provato a popolarlo così:

$self->$people[$counter](Employee->new()->dispatch());

Ma continua a ricevere messaggi di errore "Errore di sintassi vicino a> $ people []"

risposte:

3 per risposta № 1

Stai ambientando accessor => @people che mostra un malinteso fondamentale di cosa lexical_has lo fa. lexical_has installa un coderef in quella variabile, quindi dovrebbe essere uno scalare.

Quindi, una volta che hai $people come uno scalare, che lexical_has ha installato un coderef in, quindi $self->$people() o $self->$people è una chiamata al metodo che restituisce un arrayref. Così @{ $self->$people } è l'array (non-ref) stesso, che puoi usare per push / pop / shift / unshift / grep / map / sort / foreach / ecc.

Esempio veloce:

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;

L'output è:

Alice
Bob
Carol

Ecco il codice equivalente che utilizza un attributo pubblico per 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;