Thread Kindobjekte schon gelöscht bei global destruction (2 answers)
Opened by topeg at 2011-02-10 10:38

topeg
 2011-02-10 18:49
#145570 #145570
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
An weaken() habe ich nicht mehr gedacht.

Damit geht es auch:
more (18.9kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/perl
use strict;
use warnings;

########################################################################
package mytest;

sub new { bless({obj=>{}, update=>0 },$_[0]); }

sub add
{
  my $self=shift;
  my $name=shift;
  my $obj=$self->{obj};
  if($name && !exists($obj->{$name}))
  {
    my $val=shift;
    $obj->{$name}=mytest::child->new($name,$val,$self);
    $self->{update}=1;
  }
}

sub get
{
  my $obj=shift->{obj};
  return exists($obj->{$_[0]})?$obj->{$_[0]}:undef;
}

sub save
{
  my $self=shift;
  my %obj=%{$self->{obj}};
  if(%obj && $self->{update})
  {
    # save dummy
    print $_->serialized() for(values(%obj));
  }
}

sub DESTROY
{
  my $self=shift;
  $self->save();

  for(values(%{$self->{obj}}))
  { delete($_->{up}); }
}

########################################################################
package mytest::child;
use Scalar::Util 'weaken';

sub new
{
  my $class=shift;
  my $self={};
  $self->{name}=shift;
  $self->{val}=shift;
  $self->{up}=shift;

  bless($self,$class);

  weaken($self->{up}) if($self->{up});

  return $self
}

sub val
{
  my $self=shift;
  if(@_)
  {
    $self->{val}=shift;
    $self->{up}->{update}=1 if($self->{up});
  }
  $self->{val};
}

sub name{ shift()->{name}; }

sub serialized { '{ '.join(', ',map{"$_ => ".$_[0]->{$_}}qw(name val))." }\n"; }

########################################################################
########################################################################
########################################################################
package main;
use Data::Dumper;

my $t=mytest->new();
$t->add(qw(test1 A));
$t->add(qw(test2 B));
$t->add(qw(test3 C));
$t->add(qw(test4 D));

print Dumper($t);

View full thread Kindobjekte schon gelöscht bei global destruction