[Moscow.pm] weaken with функции
Ivan Petrov
i.petro.77.00 на gmail.com
Вс Фев 27 22:49:51 PST 2011
> > некий код:
> >
> > sub method
> > {
> > my $self = shift;
> > ...
> > $self->{handle} = AnyEvent::Handle fh => $fh, on_error => sub {
> > $self->{error} = $! };
> > ...
> > }
> >
> > получается что каллбек цепляет ссылку на $self и из за него деструктор
> > вызван не может быть до тех пор пока handle не уничтожится.
> > в случае с просто ссылками - понятно: weaken на них. а здесь куда можно
> > weaken натравить чтобы деструктор у такого объекта работал?
>
> После $self = shift; добавить weaken($self);
>
В этом случае если эта работа делается внутри конструктора, то добавление
такого weaken приводит к тому что вместо указателя на объект возвращается
какая-то ахинея.
вот такой тест:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use open qw(:std :utf8);
package TestW;
use AnyEvent::Handle;
use Scalar::Util qw(weaken);
sub new {
my ($class, $fh) = @_;
my $self = bless { } => $class;
# weaken $self;
$self->{handle} = new AnyEvent::Handle
fh => $fh,
on_error => sub { $self->{error} = $! };
return $self;
}
package main;
use Data::Dumper;
my $o = new TestW(\*STDIN);
print Dumper $o;
печатает на выходе следующее:
$VAR1 = bless( {
'handle' => bless( {
'_activity' => '1298875336.78856',
'_ractivity' => '1298875336.78856',
'_wactivity' => '1298875336.78856',
'fh' => \*::STDIN,
'oobinline' => 1,
'on_error' => sub { "DUMMY" }
}, 'AnyEvent::Handle' )
}, 'TestW' );
теперь если раскоментировать weaken, то объект превратится в простой хеш:
$VAR1 = {
'handle' => bless( {
'_activity' => '1298875430.28919',
'_ractivity' => '1298875430.28919',
'_wactivity' => '1298875430.28919',
'fh' => \*::STDIN,
'oobinline' => 1,
'on_error' => sub { "DUMMY" }
}, 'AnyEvent::Handle' )
};
и как быть?
Perl 5.10.1
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110228/92c0516e/attachment.html>
Подробная информация о списке рассылки Moscow-pm