我有一种情况,我想缓存一些计算供以后使用。假设我有一个允许值列表。由于我将检查该列表中是否有任何内容,因此我希望将其作为哈希值以提高效率和方便性。否则我必须grep。
如果我使用 Moose,如果每次更改允许值列表时都重新计算缓存,那就太好了。我可以用一个足够简单的触发器来做到这一点......
has allowed_values => (
is => 'rw',
isa => 'ArrayRef',
trigger => sub {
my %hash = map { $_ => 1 } @{$_[1]};
$_[0]->allowed_values_cache(\%hash);
}
);
has allowed_values_cache => (
is => 'rw',
isa => 'HashRef',
);
并且两者将保持同步...
$obj->allowed_values([qw(up down left right)]);
print keys %{ $obj->allowed_values_cache }; # up down left right
现在假设我想要一个默认的allowed_values
,足够简单的改变......
has allowed_values => (
is => 'rw',
isa => 'ArrayRef',
trigger => sub {
my %hash = map { $_ => 1 } @{$_[1]};
$_[0]->allowed_values_cache(\%hash);
},
default => sub {
return [qw(this that whatever)]
},
);
...除了设置默认值不会调用触发器。要将其用于 DWIM,我需要复制缓存。
has allowed_values => (
is => 'rw',
isa => 'ArrayRef',
trigger => sub {
$_[0]->cache_allowed_values($_[1]);
},
default => sub {
my $default = [qw(this that whatever)];
$_[0]->cache_allowed_values($default);
return $default;
},
);
sub cache_allowed_values {
my $self = shift;
my $values = shift;
my %hash = map { $_ => 1 } @$values;
$self->allowed_values_cache(\%hash);
return;
}
Moose 文档明确表示trigger
在设置默认值时不会被调用,但它会妨碍您。我不喜欢那里的重复。
有更好的方法吗?