後で使用するためにいくつかの計算をキャッシュしたい状況があります。許可された値のリストがあるとしましょう。そのリストに何かが含まれているかどうかを確認するので、効率と利便性のためにハッシュとして使用したいと思います。そうでなければ、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',
);
そして、2つは同期を維持します...
$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
いますが、邪魔になります。私はそこでの複製が好きではありません。
それを行うためのより良い方法はありますか?