在我们的类中,我们有一个模式,我们创建一个属性来表示
计算值。出于显而易见的原因,我们想要缓存计算值
然后当基础值之一发生变化时使缓存失效。
所以我们目前有这个:
package FooBar;
use Moose;
has 'foo' => (
accessor => {
'foo' => sub {
my $self = shift;
if (@_ > 0) {
# writer
$self->{foo} = $_[0];
# reset fields that are dependant on me
$self->{bar} = undef;
}
# reader part;
return $self->{foo};
}
}
);
has 'bar' => (
accessor => {
'bar' => sub {
my $self = shift;
if (@_ > 0) {
# writer
$self->{bar} = $_[0];
}
# reader part;
$self->{bar} = calculate_bar($self->foo, $self->baz)
if (not defined($self->{bar}));
return $self->{bar};
}
}
);
sub calculate_bar { ... }
这种长手方法在计算值时变得非常乏味且容易出错
取决于其他计算值。
是否有更智能/更简单的方法让“bar”监控它所依赖的属性
与让“foo”知道谁依赖它?另外我怎样才能避免通过哈希设置栏
会员访问?
如果我理解正确的话,你可以使用triggers http://search.cpan.org/~flora/Moose-0.93/lib/Moose/Manual/Attributes.pod#Triggers设置属性后清除属性。这是一个例子:
has 'foo' => (
is => 'rw',
trigger => sub{
my ($self) = @_;
$self->clear_bar;
}
);
has 'bar' => (
is => 'rw',
clearer => 'clear_bar',
lazy => 1,
default => sub{
my ($self) = @_;
return calculate_bar( ... );
}
);
所以,任何写入foo
via $obj->foo($newvalue)
会引发bar
将被清除,并在下次访问时重新创建。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)