我有两个需要昂贵计算的对象属性,因此我希望它们是懒惰的。它们是最有效地一起计算的,所以我想同时计算它们。穆斯提供了一种方法吗?
我想要的是类似“default”或“builder”的东西,但是它没有返回默认值,而是直接设置属性。返回值将被忽略。
has max_things =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
has max_pairs =>
is => 'rw',
isa => 'Int',
lazy => 1,
xxxxx => '_set_maxes';
# Let's just assume this is an expensive calculation or the max_*
# attributes are used rarely and a lot of objects are created.
sub _set_maxes {
my $self = shift;
if( $self->is_32_bit ) {
$self->max_things(2**31);
$self->max_pairs(12345 * 2);
}
else {
$self->max_thing(2**63);
$self->max_pairs(23456 * 2);
}
return;
}
注意:我可以编写自己的“阅读器”或使用“around”,但是我宁愿保持其声明性,然后让Moose来做。我也可以创建一个新对象来存储配对的值,但是对于两个值似乎有点过头了。
最佳答案
我不会说这特别优雅,但是它可以工作...
use v5.14;
use warnings;
package Goose {
use Moose;
has max_things => (
is => 'rw',
isa => 'Int',
lazy => 1,
default => sub { shift->_build_maxes->max_things },
);
has max_pairs => (
is => 'rw',
isa => 'Int',
lazy => 1,
default => sub { shift->_build_maxes->max_pairs },
);
sub is_32_bit { 1 }
sub _build_maxes {
my $self = shift;
warn "Running builder...";
if( $self->is_32_bit ) {
$self->max_things(2**31);
$self->max_pairs(12345 * 2);
}
else {
$self->max_thing(2**63);
$self->max_pairs(23456 * 2);
}
$self; # helps chaining in the defaults above
}
}
my $goose = Goose->new;
say $goose->max_things;
say $goose->max_pairs;
关于perl - 在Moose中,如何通过一个方法调用设置多个默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22234859/