2013-07-08 3 views
2

약간 긴 코드는 죄송하지만 거의 작동하는 예제를 제공하고 싶습니다. 위의 코드를 실행하는 경우 무스에서 ArrayRef [클래스]를 사용하는 방법

package MLQ::Jobs::Job { 
    use 5.016; 
    use Moose; 
    use warnings; 
    has 'name' => (is=>'rw', isa=>'Str'); 
    has 'status' => (is=>'rw', isa=>'Str'); 
} 

package MLQ::Jobs { 
    use 5.016; 
    use Moose; 
    use warnings; 
    #use MLQ::Jobs::Job; 

    has jobs => (
     is => 'rw', 
     isa =>'ArrayRef[MLQ::Jobs::Job]',  #jobs - an array of zero to many jobs 
     builder => '_scan_jobs',    #initializing it when creating the object Jobs 
    ); 

    sub _scan_jobs { 
     my $self = shift; 
     #test code 
     foreach my $i (1..10) { 
      my $j = MLQ::Jobs::Job->new(); 
      $j->name("name $i"); 
      $j->status("stat $i"); 
      push @{$self->{jobs}}, $j; 
     } 
    } 
} 

package main { 
    use 5.016; 
    use warnings; 
    use Data::Dumper; 
    #use MLQ::Jobs; 
    my $j = MLQ::Jobs->new(); 
    say Dumper $j; 
} 

모든에서 하지 helpfull이다 무엇 10 개 라인 긴 오류 메시지 을 얻었다. 적어도 캐주얼 펄 프로그래머 도움이되지 않습니다 - 나 같은 ... :(

Attribute (jobs) does not pass the type constraint because: Validation failed for 'ArrayRef[MLQ::Jobs::Job]' with value at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 1289. 
     Moose::Meta::Attribute::verify_against_type_constraint('Moose::Meta::Attribute=HASH(0x7fce1082ec78)', '', 'instance', 'MLQ::Jobs=HASH(0x7fce1082a378)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 1276 
     Moose::Meta::Attribute::_coerce_and_verify('Moose::Meta::Attribute=HASH(0x7fce1082ec78)', '', 'MLQ::Jobs=HASH(0x7fce1082a378)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Attribute.pm line 546 
     Moose::Meta::Attribute::initialize_instance_slot('Moose::Meta::Attribute=HASH(0x7fce1082ec78)', 'Moose::Meta::Instance=HASH(0x7fce1082f4a0)', 'MLQ::Jobs=HASH(0x7fce1082a378)', 'HASH(0x7fce1082a360)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Class/MOP/Class.pm line 525 
     Class::MOP::Class::_construct_instance('Moose::Meta::Class=HASH(0x7fce108372a8)', 'HASH(0x7fce1082a360)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Class/MOP/Class.pm line 498 
     Class::MOP::Class::new_object('Moose::Meta::Class=HASH(0x7fce108372a8)', 'HASH(0x7fce1082a360)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Meta/Class.pm line 274 
     Moose::Meta::Class::new_object('Moose::Meta::Class=HASH(0x7fce108372a8)', 'HASH(0x7fce1082a360)') called at /Users/me/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/darwin-2level/Moose/Object.pm line 28 
     Moose::Object::new('MLQ::Jobs') called at moo2.pl line 38 
+0

'푸시 @.. {$ 셀프 -> {작업}} $ j;'당신이 설정 한'jobs' 접근 메소드를 우회하여 배열 참조에 직접 씁니다. 이것은'push @ {$ self-> jobs}, $ j'이어야합니다. 5.16을 사용하기 때문에 'push $ self-> jobs, $ j'을하십시오. – Schwern

답변

5

문제는 같은 그 builder 방법입니다 ... 1 라인을 이해하지만, 코드에서 오류를 찾을 수 없습니다 default는, 속성 자체를 초기화하지 속성에 넣어 될 값을 반환 해야하는 당신은 BUILD 방법으로 그렇게 할 것

sub _scan_jobs { 
    my $self = shift; 

    my @jobs; 
    foreach my $i (1..10) { 
     my $j = MLQ::Jobs::Job->new(); 
     $j->name("name $i"); 
     $j->status("stat $i"); 
     push @jobs, $j; 
    } 

    return \@jobs; 
}