如何防止无限递归(使用 Moose)?
How to prevent infinite recursion (with Moose)?
在下面的代码片段(Perl with Moose)中似乎有一个无限递归:
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 和其他数据库字段的绑定哈希。
执行此操作的正确方法是什么(以确保我们防止无限递归)?
将 if ($self->id)
替换为 if ($self->has_id)
是一个解决方案。
在下面的代码片段(Perl with Moose)中似乎有一个无限递归:
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 和其他数据库字段的绑定哈希。
执行此操作的正确方法是什么(以确保我们防止无限递归)?
将 if ($self->id)
替换为 if ($self->has_id)
是一个解决方案。