2010-10-13 2 views
0

Так что я просто пытаюсь сделать очень простую вещь: определить пользовательский аксессуар для читателя для атрибута moose. Поэтому я стараюсь это:perl Moose accessor madness - не может определить только аксессуар для чтения или записи!

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

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

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

и производит следующее сообщение об ошибке:

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

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

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

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

пытался Синан ответ, но все еще получает:

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

Я не знаю Лось достаточно, чтобы понять, в чем проблема, но кто-то, пожалуйста, измените название сообщения в вопрос. –

+0

Я почему-то создал имя читателя 'get_compiled_regex' при редактировании скрипта. Вот почему вы получаете это сообщение. –

ответ

2

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

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

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

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

+0

вот в чем проблема: я определил пользовательский сценарий, скажем 'write_attr' в атрибуте, скажем $ self-> my_attr. Теперь последняя строка write_attr - $ self-> my_attr ($ some_var).Это не работает по причинам, описанным в вопросе, но даже если бы это так, не создало бы бесконечный регресс, поскольку последняя строка write_attr эффективно вызывает write_attr? – ennuikiller

+1

@ennui: «последняя строка write_attr ...» указывает на проблему: это не суб, которое вы должны определять самостоятельно. Он автоматически генерируется с помощью директивы 'writer'. – Ether

+1

ОК, то как мне создать пользовательский писатель? – ennuikiller

0

Я продолжаю гадать, чем собственно вопрос, но у меня есть ощущение, следующий ему соответствует:

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"; 
} 
+0

@ Другие сожалеют, в комментарии говорится о первом ответе Синана, а не о том, что выше. – ennuikiller

+0

см. Мой отредактированный ответ. – ennuikiller

0

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

+1

вы видите, почему perl oo с лосями, er, странно. compiled_regex должен быть атрибутом, а не методом ..... как этот атрибут установлен, должен быть, er, не имеет значения. - – ennuikiller

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