2
В следующем фрагменте кода (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
является хэш привязан который содержит идентификатор и другие поля БД.
Каков правильный способ сделать это (чтобы избежать бесконечной рекурсии)?
Кажется, что замена 'if ($ self-> id)' с 'if ($ self-> has_id)' является решением – porton
Да. Не стесняйтесь отвечать на свой вопрос. Предикаты не приводят к запуску строителей. – AKHolland