Perl Moose accessor безумие - не может определить только читатель или писатель аксессор! - PullRequest
0 голосов
/ 13 октября 2010

Так что я просто пытаюсь сделать очень простую вещь: определить собственный метод чтения для атрибута лося. Поэтому я пытаюсь это:

has 'compiled_regex' => ( 
    isa => 'RegexpRef', 
    is => 'rw', 
    reader => 'get_compiled', 
);

но get_compiled никогда не вызывается, предположительно потому, что compiled_regex - чтение / запись. Без проблем. Затем я попробую это:

 has 'compiled_regex' => ( 
     isa => 'RegexpRef', 
     writer => '_compile', 
     reader => 'get_compiled', 
 );

, и это приводит к следующей ошибке:

Не удается найти метод объекта "compiled_regex" через пакет "PrettyRegex" в строке ../lib/Pretty/Regexs.pm 39.

, которая ссылается на эту строку в методе _ compile:

$self->compiled_regex(qr/$self->regex/);

Теперь я не выспался последние 3 дня, поэтому, может быть, я запутался, но, похоже, даже если бы это сработало, это вызвало бы бесконечный регресс, поскольку я определил писателя как _compile ... так чего мне здесь не хватает?

попробовал ответить Синану, но все равно получил:

Can't locate object method "compiled_regex" via package "PrettyRegex" at ../lib/Pretty/Regexs.pm line 41.

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Мне неясно, что вы пытаетесь сделать.reader и writer - это методы, которые Moose создает для вас, а не методы, которые вы пишете и которые он вызывает.

Я думаю, что вам нужно повторить свой вопрос, чтобы объяснить проблему более высокого уровня, которую вы пытаетесьрешать.Я ожидаю, что есть лучший способ сделать это, чем вы думаете, но мы не можем быть уверены, не зная, что вы действительно пытаетесь сделать.

Если вы пытаетесь получить свой заказМетод, вызываемый при чтении атрибута, просто назовите читателя как-нибудь еще (например, _get_compiled_regex) и назовите ваш метод compiled_regex.Или используйте модификатор метода для метода читателя.(Это, вероятно, лучше, потому что тогда вы не забудете die, если кто-то передаст параметр в ваш метод чтения, пытаясь установить атрибут.)

Возможно, вы захотите использовать триггер на каком-то другоматрибут, который очищает этот.

0 голосов
/ 14 октября 2010

Er?Если ваш читатель называется get_compiled, а ваш писатель - _compile, то у вас нет метода с именем compiled_regex, и должно быть очевидно, почему вызов этого несуществующего метода завершится неудачно.Вам нужно сделать несколько шагов назад и объяснить, что вы пытаетесь сделать, а не то, что идет не так, как вы пытались это сделать.

0 голосов
/ 13 октября 2010

Я продолжаю догадываться, что же это за вопрос, но у меня такое чувство, что ему соответствует следующее:

package My::M;

use Moose;
use namespace::autoclean;

has 'compiled_regex' => (
    isa => 'RegexpRef',
    is  => 'ro',
    writer => '_set_compiled_regex',
);

sub compile {
    my $self = shift;
    my ($pat) = @_;
    $self->_set_compiled_regex(qr/$pat/);
    return;
}

__PACKAGE__->meta->make_immutable;

package main;
use strict; use warnings;

my $m = My::M->new;
$m->compile( '^\W+\z' );

if ( '@#$%%$' =~ $m->compiled_regex ) {
    print "Hmph!\n";
}
...