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