2012-05-11 2 views
2

Я пытаюсь передать ссылку на метод записи атрибута другому методу класса. Метод setter, по-видимому, вызывается после выполнения инструкции print. Однако следующие результаты ошибок:Исключение Perl Moose при вызове ссылки на способ записи атрибута

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 

Есть ли причина, почему ссылка на сгенерированный метод писателя не может быть принято или есть другой или лучший способ сделать это в Moose?

Вот код:

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); 

Причины вы получаете «Атрибут (реж) требуется, поэтому не может быть установлен в неопределенное значение» является то, что Perl считает, что $dir является объектом и его значение отсутствует (и, следовательно, undef), и, по-видимому, он делает это, прежде чем он замечает, что $dir не является объектом.

Смежные вопросы