我有一个带有 lazy_build
的 Moose 类(class)属性。该属性的值是另一个(非惰性)属性的函数。
假设有人用 42 的值为 required 属性实例化类。然后他们请求lazy 属性,计算为42 的函数。然后,他们还好意思改第一个属性!
懒惰的已经被构建了,所以构建器不会被再次调用,而且懒惰的属性现在已经过时了。
我现在有一个解决方案,我在所需的属性上维护一个“脏”标志,懒惰的访问器检查脏标志并在需要时重建它。
然而,这似乎是很多工作。有没有办法在 Moose 中处理这个问题,例如使用特征?
最佳答案
我的典型解决方案:
has 'attr1' => (
...
trigger => \&clear_attr2,
);
即当 attr1 被更新时,attr2 被清除,并将在下次访问时重建。
clear_attr2
使用时免费赠送 lazy_build
.只要您使用访问器方法,就不需要“脏”标志。这是一种常见的模式 - 处理“派生”属性的某种特征会很好。
关于perl - 当 Moose 中的底层属性发生变化时重建延迟构建的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2707812/