如何防止无限递归(使用Moose)?

时间:2016-08-12 12:06:40

标签: perl recursion moose

在下面的代码片段(带有Moose的Perl)中,似乎存在无限递归:

has 'ORM' => ( is     => 'ro',
               isa     => 'Model::LazySQLModel',
               lazy    => 1,
               builder => 'ORM_builder' );

has 'id' => ( is        => 'ro',
              isa       => 'Int',
              lazy      => 1,
              builder   => 'id_builder',
              predicate => 'has_id',
            );

sub id_builder { $_[0]->ORM->id }

sub ORM_builder {
  my ($self) = @_;

  # FIXME: looks like infinite recursion
  if ($self->id) {
    return $self->ORM_find();
  } else {
    return $self->ORM_insert();
  }
}

备注:Model::LazySQLModel是一个绑定的哈希,它包含ID和其他数据库字段。

这样做的正确方法是什么(确保我们阻止无限递归)?

1 个答案:

答案 0 :(得分:2)

if ($self->id)替换if ($self->has_id)是一种解决方案。