gpt4 book ai didi

perl - 如何更新散列属性,更新 Perl Moose 中的其他散列属性

转载 作者:行者123 更新时间:2023-12-05 09:37:21 29 4
gpt4 key购买 nike

这里 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 中的条目。知道我怎样才能做到这一点吗?

最佳答案

您是否正在尝试创建值长度的缓存?在实践中,length 非常快,您不需要缓存它,但它可能只是更复杂事物的简化示例。我会使用一个触发器,在第一个散列上加上一个特征来强制通过方法设置值。直接更改哈希值不会触发其他属性的更改。

#!/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 :-(

关于perl - 如何更新散列属性,更新 Perl Moose 中的其他散列属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64238858/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com