perl - 如何更新哈希属性,更新 Perl Moose 中的其他哈希属性
问题描述
这里 hash2 属性依赖于 hash1。事实上,hash2 是由 hash1 驱动的。例如,
hash1 -> key1 => value1, key2 => value2 等等。
hash2 -> key1 => 6, key2 => 6 等它是长度(来自 hash1 的值,去 hash2)
尝试了类似下面的方法,但没有帮助。
has 'hash1' => (
is => 'rw',
isa => 'HashRef[Str]',
default => sub { {} },
handles => {
map { $_ . '_hash1' => $_ } @hash_delegations
},
);
has 'hash2' => (
is => 'rw',
isa => 'HashRef',
builder => '_filter_hash1',
handles => {
map { $_ . 'hash2' => $_ } @hash_delegations
},
);
sub _filter_hash1 {
my $self = shift;
for my $alias ($self->keys_hash1()) {
return {$alias, length($alias)};
}
}
Hash1 将随着时间的推移而设置,不确定如何确保我应该如何捕获 hash1 上的事件以更新 hash2 中的条目。知道如何实现这一目标吗?
解决方案
您是否正在尝试创建值长度的缓存?实际上,长度是如此之快,您不需要缓存它,但它可能只是更复杂事物的简化示例。我会使用触发器,加上第一个哈希的特征来强制通过方法设置值。直接更改哈希值不会触发其他属性的更改。
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
{ package My::Object;
use Moose;
my @hash_delegations = qw( keys );
has 'hash1' => (
is => 'rw',
isa => 'HashRef[Str]',
default => sub { {} },
trigger => \&_update_hash2,
traits => ['Hash'],
handles => { set_hash1 => 'set' },
);
has 'hash2' => (
is => 'ro',
writer => '_set_hash2',
isa => 'HashRef',
);
sub _update_hash2 {
my ($self, $new, $old) = @_;
$self->_set_hash2({ map { $_ => length $self->hash1->{$_} }
keys %{ $self->hash1 }});
}
}
my $o = 'My::Object'->new(hash1 => {a => 42, b => 'Universe'});
say $o->hash2->{$_} for qw( a b );
$o->set_hash1(c => '0123456789');
say $o->hash2->{c};
$o->hash1->{c} = ""; # Wrong!
say $o->hash2->{c}; # Didn't change :-(
推荐阅读
- java - 编译器如何读取 Java 注释?
- wordpress - 根据用户付款选择 woocommerce 设置结帐税
- javascript - 使用正则表达式或替代方法从字符串返回 javascript 对象
- python - 如何从列表的字典中获取元素
- javascript - 在浏览器中打开 pdf 和视频新标签,而不是使用第三方插件下载
- c++11 - 选择 QListWidget 后如何显示正确的 QStackedWidget 页面
- python - Nltk lemmatizers 不识别化学名称的复数形式
- python-3.x - 使用 PyTorch 实现一个简单的 ResNet 块
- tensorflow - 如何从 pts 标签文件中导出 TFRecords 以用于 tensorflow 对象检测 api?
- xml - 在 xslt 1.0 的 for-each 循环中添加多个节点