我有兩個需要昂貴計算的對象屬性,所以我希望它們很懶。它們最有效地一起計算,所以我想同時計算它們。穆斯提供了一種方法來做到這一點?在Moose中,如何使用一個方法調用設置多個默認值?
我想要的是像'默認'或'建設者',但不是返回默認值,它直接設置屬性。返回值將被忽略。
has max_things =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
has max_pairs =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
# Let's just assume this is an expensive calculation or the max_*
# attributes are used rarely and a lot of objects are created.
sub _set_maxes {
my $self = shift;
if($self->is_32_bit) {
$self->max_things(2**31);
$self->max_pairs(12345 * 2);
}
else {
$self->max_thing(2**63);
$self->max_pairs(23456 * 2);
}
return;
}
注:我可以寫我自己的「閱讀器」或使用「左右」,但我寧願把它的聲明,讓駝鹿做的工作。我也可以創建一個新對象來存儲配對值,但對於兩個值來說似乎是過度殺傷性的。
看到您通過緩存結果'$自避免調用'_build_both_maxes'兩次 - > _ both_maxes'。一個聰明的工作。內存的兩倍並不適合我,而這個假屬性會讓下一位維護者感到困惑。 – Schwern
@Schwern是的,我也不愛它,但它是我遇到的最好的解決方案。希望有一些相互競爭的答案。 – AKHolland