/ / ¿Alguien puede explicar cómo implementar y utilizar matrices de ámbito privado en Moops? - perl, alce, moops

¿Alguien puede explicar cómo implementar y utilizar matrices de ámbito privado en Moops? - perl, alce, fregonas

Estoy tratando de aprender Moops y no puedo entender bien cómo usar populate e iterar sobre lexical_has arrayRefs. ¿Puede demostrar su uso aquí con código, por favor?

Escribí lo siguiente:

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

Traté de poblarlo así:

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

Pero sigue apareciendo un error "Error de sintaxis cerca de> $ personas []"

Respuestas

3 para la respuesta № 1

Usted está estableciendo accessor => @people que muestra un malentendido fundamental de lo que lexical_has hace. lexical_has instala una referencia de código en esa variable, por lo que debería ser un escalar.

Entonces, una vez que tengas $people como un escalar, que lexical_has ha instalado una referencia de código en, luego $self->$people() o $self->$people es una llamada a un método que devuelve un arrayref. Por lo tanto @{ $self->$people } es la matriz (no ref) en sí, que puede usar para push / pop / shift / unshift / grep / map / sort / foreach / etc.

Ejemplo rápido:

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;

La salida es:

Alice
Bob
Carol

Aquí está el código equivalente usando un atributo público para 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;