我正在尝试学习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[]”
发布于 2014-12-03 22:07:37
您正在设置accessor => \@people,这显示了对lexical_has所做工作的根本误解。lexical_has在这个变量中安装一个代码,所以它应该是一个标量。
因此,一旦您将$people作为标量( lexical_has已经在其中安装了代码),那么$self->$people()或$self->$people就是一个返回arrayref的方法调用。因此,push/pop/shift/unshift/grep/map/sort/foreach/etc.是(Non)数组本身,您可以将其用于@{ $self->$people }。
简单的例子:
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;https://stackoverflow.com/questions/27277415
复制相似问题