2010-10-13 17 views
0

所以我只是想做一件非常簡單的事情:爲駝鹿屬性定義一個自定義閱讀器訪問器。所以,我試試這個:perl駝鹿訪問者瘋狂 - 不能只定義一個讀者或作家accessor!

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 ......所以它會產生無限的迴歸我在這裏失蹤?

試圖思南的答案,但仍然得到:

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

我不知道穆斯足夠了解問題是什麼,但有人請將帖子的標題改爲問題。 – 2010-10-13 19:30:14

+0

由於某種原因編輯腳本時,我使讀者的名字爲'get_compiled_regex'。這就是爲什麼你得到這個信息。 – 2010-10-13 19:44:50

回答

2

我不清楚在你想要做什麼。 readerwriter是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 2010-10-13 19:37:18

+1

@ennui:「write_attr的最後一行...」表示問題:這不是你應該自己定義的子。它是通過'writer'指令自動生成的。 – Ether 2010-10-13 19:49:43

+1

好吧,那我該如何創建一個自定義作家? – ennuikiller 2010-10-13 19:55:59

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 2010-10-13 19:26:37

+0

請看我編輯的答案。 – ennuikiller 2010-10-13 19:33:07

0

呃?如果您的讀者被稱爲get_compiled,並且您的作者被稱爲_compile,那麼您沒有名爲compiled_regex的方法,並且應該很明顯爲什麼對該不存在的方法的調用會失敗。您需要採取幾個步驟並解釋您要做的事情,而不是您嘗試做的方式出了什麼問題。

+1

你看這就是爲什麼perl oo與駝鹿是呃奇怪。 compiled_regex應該是一個屬性,而不是一個方法.....如何設置該屬性應該,呃,不相關。 - – ennuikiller 2010-10-14 13:30:21