2014-12-03 9 views
1

나는 Moops를 배우려고 노력하고 있는데 어떻게 lexical_has arrayRefs를 채우고 반복 하는지를 이해할 수 없다. 코드로 사용법을 보여 주시겠습니까?누군가 Moops에서 비공개 범위 배열을 구현하고 활용하는 방법을 설명해 주실 수 있습니까?

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

내가 thusly 히 그것을 채우기 위해 노력 :

나는 다음과 같이 썼다

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

을하지만

"> $ 사람 [] 근처에 구문 오류"오류 - 보내고 나 유지
+0

니스 편집 ... people에 대한 대중의 속성을 사용하여 해당 코드입니다. 이제 나는 네가 대답을 할 수 있다고 생각한다. –

답변

3

lexical_has의 기본적인 오해를 나타내는 accessor => \@people을 설정하고 있습니다. lexical_has은 코드 레터를 해당 변수에 설치하므로 스칼라가되어야합니다. 당신이 lexical_has 다음으로 코드 참조를 설치 한 스칼라로 $people을 일단

그래서, $self->$people() 또는 $self->$people은 arrayref를 반환하는 메소드 호출이다. 따라서 @{ $self->$people }은 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 

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

+0

직선 속성보다 lexical_has를 선택해야하는 이유는 무엇입니까? – Marty