当通过引用更改属性内容而不是通过更改器(mutator)设置其值时,Moose 是否有任何方法触发回调?
让我们假设以下代码:
has _changed => ( is => 'rw' , isa=>'Bool' ) ;
has attribute => (
is=>'rw', isa=>'Maybe[HashRef]',
default => sub { { a => 1 , b => 2 } },
trigger => sub { shift->_changed(1) }
) ;
触发器按预期工作,通过更改器(mutator)设置属性值:
$self->attribute({ a => 2 , b => 2 }) ; # OK
但是通过其键直接设置一个值,那么触发器不会触发(当然):
$self->attribute->{a} = 3 ; # KO
我放弃了创建(和比较)序列化属性内容摘要的想法,因为它可能是一个非常巨大的具有多个嵌套级别的哈希引用,并且在每个属性访问时进行摘要可能会产生性能问题。
绑定(bind)的哈希引用(作为属性值)可能是一个可能的解决方案吗? 任何想法或建议都非常感激。
注意:所包含的 hashref 的结构未知(我正在编写一个 ORM 类,因此该结构可能会根据存储在 NOSQL 数据库端的文档而有所不同)。
最佳答案
一旦您直接更改哈希引用而不是使用访问器方法,Moose 就不再涉及。让您的属性返回对绑定(bind)哈希的引用将是对可观察的哈希进行更改的唯一策略,但这并不是一个特别有吸引力的解决方案。绑定(bind)变量很少见,并且可能会在某些代码中触发错误。它们实现起来相对困难。它们意味着每次哈希访问都会产生性能开销。
认真考虑是否可以更改设计以避免暴露内部哈希。例如。有一个仅返回哈希的(浅)副本的 getter,以及哈希中各个元素的 setter。您可以使用handles
和traits
机制自动生成其中一些访问器,例如请参阅 Moose::Meta::Attribute::Native::Trait::Hash .
关于perl - 观察驼鹿属性的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218233/