Может кто-нибудь объяснить, как реализовать и использовать массивы частной области в Moops?

Я пытаюсь изучить Moops, и я не могу понять, как использовать заполнение и перебирать lexical_has arrayRefs. Можете ли вы продемонстрировать их использование здесь с кодом, пожалуйста?

Я написал следующее:

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

Я попытался заполнить это так:

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

Но это заставляет меня ошибаться "Синтаксическая ошибка рядом с $people[]"

1 ответ

Решение

Вы устанавливаете accessor => \@people который показывает фундаментальное недопонимание того, что lexical_has делает. lexical_has устанавливает кодовую ссылку в эту переменную, поэтому она должна быть скалярной.

Итак, когда у вас есть $people как скаляр, который lexical_has установил coderef в, затем $self->$people() или же $self->$people это вызов метода, который возвращает arrayref. таким образом @{ $self->$people } это сам массив (не ref), который вы можете использовать для push / pop / shift / unshift / grep / map / sort / foreach / и т.д.

Быстрый пример:

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;

Выход:

Alice
Bob
Carol

Вот эквивалентный код, использующий открытый атрибут для 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;
Другие вопросы по тегам