perl - 观察驼鹿属性的变化

标签 perl moose

当通过引用更改属性内容而不是通过更改器(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。您可以使用handlestraits机制自动生成其中一些访问器,例如请参阅 Moose::Meta::Attribute::Native::Trait::Hash .

关于perl - 观察驼鹿属性的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53218233/

相关文章:

Perl Moose - 如何部署我的类 pm 文件?

regex - Perl正则表达式匹配元音

forms - 如何访问在 multipart/form-data POST 中上传的内容数据?

perl - 为什么我在启动 Catalyst 时收到许多 Moose 警告?

perl - 当 Moose 中的底层属性发生变化时重建延迟构建的属性

perl如何获取文件名和扩展名

perl - Perl 中的字符串比较或散列查找更快吗?

perl - 将 MooseX 元属性与 Moops 结合使用

perl - 如果Moose构建器方法失败,该怎么办?

perl - Path::Class::File 或::Dir & Moose 初始化和强制