[Moscow.pm] двусвязный список: удаление мусора

Dmitry E. Oboukhov unera на debian.org
Пн Июл 27 06:32:42 PDT 2009


package ListItem;

sub new
{
    my ($class, $value) = @_;
    my $self = bless { value => $value }, $class;
    return $self->{prev} = $self->{next} = $self;
}

sub append
{
    my ($self, $add);

    $add->{next} = $self->{next};
    $add->{prev} = $self;
    
    $self->{next}{prev} = $add;
    $self->{next} = $add;

    return $self;
}


далее собираем список:

...

package main;
my $list = ListItem->new('value1')
    ->append( ListItem->new('value2') )
    ->append( ListItem->new('value3') )
    ->append( ListItem->new('value4') )
    ->append( ListItem->new('value5') )
    ->append( ListItem->new('value6') );

ну и где-то используем

имеем во весь рост проблемы со сборкой мусора, поскольку собственно
эта сущность представляет собой набор циклических ссылок. Как-нибудь
кроме как введением деструктора можно решить проблему со сборкой
мусора? понятно что лучше массивы итп но это не подходит по некоторым
причинам. 

как вариант такое:

package ListItem;
sub new
{
    my ($class, $value) = @_;
    my $self = bless { value => $value }, $class;
    $self->set_next($self);
    $self->set_prev($self);
    $self;
}

sub set_next
{
    my ($self, $next) = @_;
    $self->{_next} = sub { $next };
}

sub set_prev
{
    my ($self, $prev) = @_;
    $self->{_prev} = sub { $prev };
}

sub next { $_[0]{_next}->() }
sub prev { $_[0]{_prev}->() }

sub append
{
    my ($self, $add);

    $add->set_next($self->next);
    $add->set_prev($self);
    $self->next->set_prev($add);
    $self->set_next($add);
    return $self;
}

Но как-то кажется неизящным. Очень странно что ссылки в анонимных
процедурах сборщик мусора нормально собирает, а в просто объектах
нет.

PS: сорри за возможные ашипки в коде
--
... mpd playing: Metallica - The God That Failed

. ''`.                               Dmitry E. Oboukhov
: :’  :   email: unera на debian.org jabber://UNera@uvw.ru
`. `~’              GPGKey: 1024D / F8E26537 2006-11-21
  `- 1B23 D4F8 8EC0 D902 0555  E438 AB8C 00CF F8E2 6537
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: отсутствует
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20090727/f5a0766b/attachment.bin>


Подробная информация о списке рассылки Moscow-pm