gpt4 book ai didi

perl - 如何最好地在 Moose 中使用默认设置触发访问器?

转载 作者:行者123 更新时间:2023-12-04 11:32:27 25 4
gpt4 key购买 nike

我有一种情况,我想缓存一些计算以供使用
之后。假设我有一个允许值的列表。既然我要去
正在检查该列表中是否有任何内容我想要它
一个为了效率和方便的哈希。否则我将不得不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什么时候不接电话
设置了默认值,但它妨碍了。我不喜欢
重复那里。

有没有更好的方法来做到这一点?

最佳答案

我最近遇到了这个问题,并在 #moose 上询问后 channel ,被告知以这种方式处理它:
马克 cache_allowed_values作为 lazy_build , 有 _build_cache_allowed_values引用当前allowed_values ,并在 allowed_values 上放置一个写触发器清除 cache_allowed_values .
这样,无论请求或保存值的顺序如何,它们总是以最少的工作量是正确的。

例子:

has cache_allowed_values => (is => 'ro', lazy_build => 1);
sub _build_cache_allowed_values {
return { map { $_ => 1 } @{shift->allowed_values} };
}
has allowed_values => (
is => 'rw',
trigger => sub { shift->clear_cache_allowed_values },
default => ...,
);

关于perl - 如何最好地在 Moose 中使用默认设置触发访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1549688/

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