2

我期待一个构建器方法可以访问调用者提供的所有其他属性。但它似乎只能访问那些名字按字母顺序小于当前属性的人。例如,为什么这里的建造者可以看到但b看不到的价值?(“a”和“c”都存在于最终对象中)ac

代码:

#!/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' );
4

1 回答 1

6

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

我不知道你想要达到什么目标,但你在寻找懒惰吗?

或者,也许b需要成为您班级中的一种方法

于 2018-02-21T14:46:41.297 回答