perl - 在Moose中,如何通过一个方法调用设置多个默认值?

标签 perl moose

我有两个需要昂贵计算的对象属性,因此我希望它们是懒惰的。它们是最有效地一起计算的,所以我想同时计算它们。穆斯提供了一种方法吗?

我想要的是类似“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/

相关文章:

python - 合并/丢弃重叠的单词

regex - 如何使用Perl正则表达式匹配字符串末尾/开头的空格或空格包围的单词?

perl - Moose 和 MooseX::Declare 的有用错误

perl - 如何在运行时替换 Moose 对象的方法?

arrays - Moose 阵列属性 : how do I use a set method?

perl - 初始化后应该如何定义 Moose 对象子例程?

具有多个相互依赖属性的 Perl Moose

perl - 在 Perl 搜索和替换中使用 ~

perl - 我们如何告诉 WWW::Mechanize::Firefox 不等待响应或回发?

mysql - perl DBD::mysql 不适用于 mysql 5.6?