一个属性的默认子如何使用Moose访问另一个属性?

时间:2016-02-04 13:27:42

标签: perl moose

###############################################################################
# Attributes
###############################################################################
has 'primary_cluster' => (
    is  => 'ro',
    isa => 'Str',
    required => TRUE,
);

has 'secondary_cluster' => (
    is  => 'ro',
    isa => 'Str',
    required => FALSE,
    default => sub {$_[0]->primary_cluster},
);

has '_connection' => (
    is => 'ro',
    required => FALSE,
    init_arg => undef,
    default => sub {
        Core::mConnection->new(
            primary_cluster => $_[0]->primary_cluster,
            secondary_cluster => $_[0]->secondary_cluster,
        );
    },
);

我正在尝试使用其他属性来创建_connection对象的私有属性mConnection。我遇到的问题是在_connection的默认子例程中,$_[0]->primary_cluster始终是undef。有没有办法保证属性创建的顺序,还是有更好的方法去做这个?

我不希望这个属性变得懒惰;我需要在构造对象时创建它。

1 个答案:

答案 0 :(得分:3)

对象仍在构建中!延迟属性的初始化,直到构造完成。以下内容将其初始化延迟到使用之前:

lazy => 1

您也可以使用BUILD方法代替default

sub BUILD {
   my $self = shift;

   $self->_connection(
      Core::mConnection->new(
         primary_cluster   => $self->primary_cluster,
         secondary_cluster => $self->secondary_cluster,
      )
   );
}

当然,您需要先将属性设为可写。