所以我只是想做一件非常简单的事情:为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
答案 0 :(得分:2)
我不清楚你要做什么。 reader
和writer
是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
的方法,并且很明显为什么调用该不存在的方法会失败。您需要采取几个步骤来解释您尝试做的事情,而不是您尝试这样做的方式出了什么问题。