2010-04-25 22 views
5

我有一个具有lazy_build属性的Moose类。该属性的值是另一个(非惰性)属性的函数。在Moose中的基础属性发生变化时重建构建属性的属性

假设某人为要求的属性实例化了一个值为42的类。然后他们请求懒惰属性,这个属性被计算为42的函数。然后,他们有勇气改变第一个属性!

懒惰的一个已经被构建,所以构建器不会再被调用,并且懒惰属性现在是过时的。

我现在有一个解决方案,现在我在所需的属性上维护一个“脏”标志,并且懒惰的访问器检查脏标志并根据需要重新构建它。

但是,这似乎很多工作。有没有办法在Moose中处理这个问题,例如使用特质?

+0

您可能想查看我提出的相同问题时的答案:[在属性值更改时计算缓存的计算结果](http://stackoverflow.com/questions/1775572/moose-expiring-cached-results -of-computation-when-attribute-values-change“当属性值改变时计算缓存结果到期”) – clscott 2010-04-28 20:30:19

回答

9

我的典型的解决方案:

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

即当attR1位被更新时,attR2位被清除,并且当它被下一个访问将被重建。当您使用lazy_build时,clear_attr2免费提供。只要使用访问器方法,就不需要“脏”标志。

这是一种常见的模式 - 处理“派生”属性的某种特质会很好。

+1

完美。我非常喜欢这个解决方案。我在'set_attr1'上做了一个'after'修饰符,朝同一个方向前进,但触发器更加简单。谢谢 – friedo 2010-04-25 21:47:59