5

属性を持つMooseクラスがありlazy_buildます。その属性の値は、別の (非遅延) 属性の関数です。

必要な属性の値が 42 のクラスを誰かがインスタンス化したとします。次に、42 の関数として計算される lazy 属性を要求します。次に、神経質になって最初の属性を変更します。

遅延属性は既にビルドされているため、ビルダーが再度呼び出されることはなく、遅延属性は古くなっています。

必要な属性に「ダーティ」フラグを維持し、レイジー フラグのアクセサがダーティ フラグをチェックし、必要に応じて再構築するという解決策があります。

ただし、これは大変な作業のようです。トレイトを使用するなど、Moose 内でこれを処理する方法はありますか?

4

1 に答える 1

9

私の典型的な解決策:

has 'attr1' => (
    ...
    trigger => \&clear_attr2, 
);

つまり、attr1 が更新されると、attr2 がクリアされ、次にアクセスされたときに再構築されます。clear_attr2を使用すると無料で付いてきますlazy_build。アクセサー メソッドを使用する限り、「dirty」フラグは必要ありません。

これは一般的なパターンです。「派生」属性を処理するためのある種の特性が適しています。

于 2010-04-25T13:07:56.643 に答える