2014-12-03 19 views
1

我想学Moops,我无法完全掌握如何使用填充和遍历lexical_has arrayRefs。你能用代码在这里演示他们的用法吗?有人能解释一下如何在Moops中实现和使用私有范围的数组吗?

我写了下面:

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

我想正是如此填充它:

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

,但会将错误-ING在我身上 “语法错误附近> $人[]”

+0

尼斯编辑。现在我怀疑你可能会得到答案。 – 2014-12-03 17:36:13

回答

3

您在设置accessor => \@people,该显示对lexical_has的作用有根本性的误解。 lexical_has安装一个coderef到该变量,所以它应该是一个标量。

所以,一旦你有$people作为一个标量,这lexical_has安装了CODEREF进入,然后$self->$people()$self->$people是它返回一个数组引用一个方法调用。因此@{ $self->$people }是(non-ref)数组本身,您可以使用它来执行push/pop/shift/unshift/grep/map/sort/foreach/etc。

简单的例子:

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; 
+0

谢谢托比!我非常感谢帮助。 – BackPacker777 2014-12-04 13:37:40

+0

什么时候/为什么会/应该选择lexical_has过直接属性? – Marty 2016-03-28 11:16:40

相关问题