2012-05-11 3 views
2

속성의 작성기 메서드에 대한 참조를 다른 클래스 메서드에 전달하려고합니다. setter 메서드는 print 문이 실행 된 이후 명백하게 호출됩니다. 그러나 다음과 같은 오류 결과 :속성의 작성기 메서드에 대한 참조를 호출 할 때 Perl 무스 예외가 발생했습니다.

Attribute (dir) is required, so cannot be set to undef at Test.pm line 51 
Test::_validateDir('Test=HASH(0x2270be0)', 'CODE(0x22a90f8)') called at test.pm line 37 
Test::BUILD('test_moose=HASH(0x2270be0)', 'HASH(0x1879728)') called at generated method (unknown origin) line 50 
Test:new('Test', dir=>'my_bin') called at ./test_moose.pl line 26 

생성 된 작가 방법에 대한 참조를 취할 수 없거나 무스에서이 작업을 수행하는 다른 또는 더 나은 방법이 이유가 있습니까?

package Test; 
use Moose; 
use File::Spec; 

has 'dir' => (is => 'ro', isa => 'Str', required => 1, writer '_set_dir',); 

sub BUILD { 
    my ($self, $hr) = @_; 
    $self->_validateDir(\&_set_dir); 
} 

sub _validate_dir { 
    my ($self, $setter) = @_; 
    my $dir = File::Spec->rel2abs($self->dir, '/home/me'); 
    if (! -e $dir) { 
     print "creating directory\n"; 
     #create directory 
    } 
    &$setter($dir); 
} 

답변

2

이 잘 정규 서브와 세터를 호출하는 것입니다 : 여기

코드인가? 첫 번째 인수로 $self을 전달하면 안됩니까?

+0

그건 문제가되었습니다. 좋은 캐치! – roadrider

+0

나는 당신의 답을 지금 삭제 취소했다. 아마도 주석처럼 보이기 위해 (다시) 삭제되지 않도록 다시 말해야한다. 또한 재미있는 읽을 거리 : http://meta.stackexchange.com/questions/131959/should-i-not-flag-a-rhetorical-question-posted-as-an-answer – BoltClock

+0

아, 고마워! 나는 분명히 대답을 시도하는 수사 학적 질문을 삭제하는 것처럼 언어에 대해 너무 항문적이어야한다고 생각하지 않습니다. – zoul

1

Perl에서 메서드에 대한 참조는 이 아니며은 연결된 개체를 포함합니다. 참조를 호출 할 때 첫 번째 매개 변수로 개체 (또는 클래스 메서드 인 경우 클래스)를 제공해야합니다.

&$setter($self, $dir); 

또는 ($setter 코드 참조하지만, 더 관용적이다 상당) :

$self->$setter($dir); 

당신이 얻을 이유 "속성 (DIR)가 필요합니다, 그래서 미확정으로 설정 될 수 없다"는 것입니다 Perl은 $dir이 개체이며 값이 누락 된 것으로 (따라서 undef) 생각하고 그 결과가 $dir은 개체가 아니라는 것을 알기 전에 분명히 확인합니다.

관련 문제