为什么Moo的构建器方法只能访问其他一些属性?

时间:2018-02-21 14:35:07

标签: perl moo

我希望构建器方法可以访问调用者提供的所有其他属性。但它似乎只能访问那些名字按字母顺序小于当前属性的人。例如。为什么b的构建器可以看到a但不是c的值? (最终对象中都包含' a'' c&#39>)

代码:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
{
    package P;
    use Moo;

    printf "Moo version: %s\n", $Moo::VERSION;

    # a and c are defined in the same way
    has a => ( is => 'ro' );
    has c => ( is => 'ro' );
    has b => (
        is => 'ro',
        builder => '_build_b',
    );

    sub _build_b {
        my ($self) = @_;
        print Data::Dumper->new(
            [ $self ], [ 'self_during_build_b' ]
        )->Indent(1)->Sortkeys(1)->Dump;
        return "somebuiltvalue";
    }
}
my $p = P->new({ a => 1, c => 3 });
print Data::Dumper->new([$p],['p'])->Indent(1)->Sortkeys(1)->Dump;

输出:

Moo version: 2.003004
$self_during_build_b = bless( {
  'a' => 1
}, 'P' );
$p = bless( {
  'a' => 1,
  'b' => 'somebuiltvalue',
  'c' => 3
}, 'P' );

1 个答案:

答案 0 :(得分:6)

实际上,对于特定成员,您不应该假设构建器中的任何其他字段。如果您的类的某个成员的值取决于一个或多个其他成员的值,那么处理它的适当位置将是类BUILD方法。

我不确切地知道你想要实现的目标,但是你在寻找lazy吗?

或者,b可能需要成为班级的方法