perl Moose accessor madness - 无法定义只有读者或作者访问者!

时间:2010-10-13 19:13:49

标签: perl moose

所以我只是想做一件非常简单的事情:为moose属性定义一个自定义阅读器访问器。所以我试试这个:

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

get_compiled永远不会被调用,大概是因为compiled_regex是读/写的。好的,没问题。我接下来试试这个:

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

并产生以下错误:

  

无法通过../lib/Pretty/Regexs.pm第39行的“PrettyRegex”软件包找到对象方法“compiled_regex”。

指的是_ compile方法中的这一行:

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

现在我在过去的3天里没有多少睡眠,所以也许我很困惑,但似乎即使这确实有效,它也会创造一个无限的回归,因为我已经将作者定义为{{1那么我在这里错过了什么?

尝试了思南的回答,但仍然得到:

_compile

3 个答案:

答案 0 :(得分:2)

我不清楚你要做什么。 readerwriter是Moose为您创建的方法,而不是您编写和调用的方法。

我认为您需要重新提出问题,以解释您尝试解决的更高级别的问题。我希望有一种比你现在想象的更好的方法,但我们不知道你真正想要做什么就不能确定。

如果您尝试在读取属性时调用自定义方法,只需将读者命名为其他内容(例如_get_compiled_regex),并将方法命名为compiled_regex。或者在reader方法上使用方法修饰符。 (这可能更好,因为如果有人将参数传递给您的阅读器方法,尝试设置属性,那么您将不会忘记die。)

您也可能希望在某个其他属性上触发清除此属性。

答案 1 :(得分: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";
}

答案 2 :(得分:0)

尔?如果您的读者被称为get_compiled,并且您的作者被称为_compile,那么您没有名为compiled_regex的方法,并且很明显为什么调用该不存在的方法会失败。您需要采取几个步骤来解释您尝试做的事情,而不是您尝试这样做的方式出了什么问题。