2012-03-17 42 views
3

我的基於Moo的類同時具有非延遲&非懶惰屬性,其中既有default也有coerce個子。如果我沒有初始化屬性,我發現defaultcoerce子被調用爲普通屬性,但只有default被稱爲lazy屬性。這似乎不一致。下面是示例代碼:Moo,懶惰屬性和默認/強制調用

package Foo; 
use Moo; 

has nrml => (is => 'ro', 
       default => sub { print "nrml default\n" }, 
       coerce => sub { print "nrml coerce\n" } 
      ); 

has lazy => (is => 'ro', 
       lazy => 1, 
       default => sub { print "lazy default\n" }, 
       coerce => sub { print "lazy coerce\n" } 
      ); 



my $q = Foo->new(); 

$q->lazy; 

輸出是:

nrml default 
nrml coerce 
lazy default 

我只希望coerce跑,如果我提供的構造函數的值。更重要的是,我期望從懶惰屬性和普通屬性的相同執行順序(defaultdefaultcoerce)。

那麼,我的期望是關閉的,這是一個錯誤,或者是什麼?謝謝!

+0

我建議你使用'builder'而不是默認值來爲默認值設置一個簡單的標量。這不是對你的問題的回答,而是一些建議。 – snoofkin 2012-03-17 01:47:23

+0

是不是'builder'設計用於子類需要訪問父類的屬性創建方法以便它們可以修改它的情況?對於不會被子類化的類,「default」似乎更重要。 – 2012-03-17 02:08:24

+0

爲了完整性,我用一個構建器替換了默認值;與以前相同的結果。 – 2012-03-17 02:46:45

回答

5

當前狀態:修復出貨009014

其中之一是一個錯誤。

事實上,考慮到這一點,人們可能會爭論到是否應該對違約行爲進行強制 - 但是因爲穆斯確實這樣做了,而且強制是結構性的(與類型檢查不同,後者通常用於斷言 - 喜歡的東西,應該總是通過,除非有一個錯誤),我認爲它就是這樣。

...實際上,問題在於Method :: Generate :: Accessor在它觸發時_use_default總是將其封裝在_generate_simple_set中,當它是_generate_set,它提供了isa + coerce +觸發器包裝 - 並且我相當確定當Moose應用默認設置時,所有三個都會觸發,所以我們也需要。

雖然這並不是一個完全微不足道的修復,因爲我沒有參數化_generate_set來指示如何生成要設置的值。我會試着在明天進行整理,因爲我打算減少發佈時間。

如果您想要開發者支持Moo,請聯繫[email protected]或加入irc.perl.org上的#web-simple--這真是太幸運了,IRC頻道的某個人看到了這個問題並詢問了它:)

+0

感謝您的迴應。我想確保在提交錯誤報告之前我沒有做一些愚蠢的事情。有時會發生。 – 2012-03-17 23:01:24

+0

總的來說,我很欣賞嘗試保持錯誤隊列清潔!但同樣我很高興在IRC上詢問你是否在做一些愚蠢的事情,甚至是進入IRC並在我們身上揮動堆棧溢出鏈接:) – 2012-03-24 18:07:40

3

這會對我來說是一個bug。預計從default得到的值是正確的類型,否則它不是。只有一半的時間擁有和執行期望是沒有道理的。

+0

謝謝。這是我的承擔。 – 2012-03-18 14:07:44