我的基於Moo的類同時具有非延遲&非懶惰屬性,其中既有default
也有coerce
個子。如果我沒有初始化屬性,我發現default
和coerce
子被調用爲普通屬性,但只有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
跑,如果我提供的構造函數的值。更重要的是,我期望從懶惰屬性和普通屬性的相同執行順序(default
或default
和coerce
)。
那麼,我的期望是關閉的,這是一個錯誤,或者是什麼?謝謝!
我建議你使用'builder'而不是默認值來爲默認值設置一個簡單的標量。這不是對你的問題的回答,而是一些建議。 – snoofkin 2012-03-17 01:47:23
是不是'builder'設計用於子類需要訪問父類的屬性創建方法以便它們可以修改它的情況?對於不會被子類化的類,「default」似乎更重要。 – 2012-03-17 02:08:24
爲了完整性,我用一個構建器替換了默認值;與以前相同的結果。 – 2012-03-17 02:46:45