Schrift
[thread]11770[/thread]

Counter innerhalb einer Klasse?

Leser: 1


<< >> 4 Einträge, 1 Seite
JackBauer
 2008-05-07 14:45
#109349 #109349
User since
2008-04-30
16 Artikel
BenutzerIn
[default_avatar]
Hier geht es weiter: Link


Hi,

wie genau realisiere ich in Perl innerhalb einer Instanz einer Klasse einen Counter?

Bisher habe ich nur mit Getter/Setter Funktionen auf meine Instanzvariablen zugegriffen. Wie kann ich direkt auf die Werte zugreifen?

Mein Ansatz war der folgende:

Code (perl): (dl )
1
2
3
4
5
6
sub count
{
    my $self=shift;
    if (@_) { $self->{count} += shift }
    return $self->{count};
}


So etwas wäre mein Wunsch:

Code (perl): (dl )
1
2
my $value = 5;
$self->counter +=  $value


Gruß

JackBauer
Antworten mit Zitat
Struppi
 2008-05-07 14:54
#109351 #109351
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Dazu musst du die Funktion anders deklarieren:
Code (perl): (dl )
1
2
3
4
5
sub count :lvalue{
     my $self=shift;
     if (@_) { $self->{count} += shift }
     $self->{count};
}

und hier darf die letzte Zeile nicht mit return $self->{count}; aufhören!

[EDIT]http://search.cpan.org/dist/perl/pod/perlsub.pod#L...
WARNING: Lvalue subroutines are still experimental and the implementation may change in future versions of Perl.
Antworten mit Zitat
sid burn
 2008-05-07 14:56
#109352 #109352
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ich würde es so machen:

Code: (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
{
package Class;
use strict;
use warnings;
use Scalar::Util qw(weaken);
my @objects;

sub new {
my ( $class ) = @_;

# Objekt erstellen
my $self = bless {}, $class;

# zum array hinzufügen
push @objects, $self;
# Wert weaken
weaken( $objects[-1] );

# Object zurück geben
return $self;
}

sub count {
my ( $self ) = @_;
return scalar @objects;
}
}

printf "Anzahl: %d\n", Class::count;

my $new1 = Class->new;
my $new2 = Class->new;

printf "Anzahl: %d\n", $new1->count;

{
my $new3 = Class->new;
printf "Anzahl: %d\n", $new3->count;
}

printf "Anzahl: %d\n", $new1->count;


Den Counter kannst du so nicht manuel setzen und somit kann keine Fehlerhafte anzahl entstehen. Und es ist von ausen aus nicht manipulierbar. "Updated" sich selber. Du benötigst halt keine DESTROY Methode wo du den Counter decrementieren musst. Die Klasse enthält referenzen zu allen Objekten. Kannst also auch über eine Methode oder Klassenmethode über alle Objekte iterieren du du derzeit besitzt.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Antworten mit Zitat
pq
 2008-05-07 14:58
#109355 #109355
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
da es 2 threads gibt und jeder schon 2 antworten hat, habe ich den hier geschlossen.
http://board.perl-community.de/thread/11771/
ein redirect nach dem posten wäre immer noch hilfreich =)
und eine merge-funktion auch.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Antworten mit Zitat
<< >> 4 Einträge, 1 Seite



View all threads created 2008-05-07 14:45.