Re: [PERL] Array i klasse
- To: sslug@sslug
- Subject: Re: [PERL] Array i klasse
- From: Anders Sønderberg Mortensen <sslug@sslug>
- Date: Sun, 22 Sep 2002 13:17:15 +0200 (CEST)
Se nedenfor....
On Sun, 22 Sep 2002, Jan Eggert Kofoed wrote:
> Peter Makholm wrote:
> > Jan Eggert Kofoed <sslug@sslug> writes:
> >
> > Jeg ville nok give mulighed for at initialiserer objektet i din
> > new-funktion.
> Jeg er ved at parse en XML fil, og udfylder objektet efterhånden som jeg
> kommer til de relevante tags.
>
> >
> >
> >>sub new
> >>{
> >> my $self = shift;
> >
> >
> > Bemærk at $self bliver sat til navnet på klassen. Kald den $class i
> > stedet.
> >
> >
> >> my @_Groups;
> >> my $r_Album =
> >
> >
> > Rent stilistisk ville jeg nok kalde $r_Album for $this eller
> > $self. Det er selve objektet du opretter her som du i alle de andre
> > metoder kalder $this eller $self.
> >
> > Hvorvidt man bruger $this eller $self er underordnet, man bør bare
> > være konsistent.
> >
> Thanx, det er jo rigtigt.
>
> >
> >> {
> >> "_name" => undef,
> >> "_id" => undef,
> >> "_dbname" => undef,
> >> "_released" => undef,
> >> "_albumartist" => undef,
> >> "_groups" => sslug@sslug
> >> };
> >
> >
> > Jeg ville nok skrive 'groups => []'. Der er ikke nogen grund til at
> > introducerer navnet @_Groups som du alligevel ikke kan bruge senere.
> >
> Anvendes nu; det er meget pænere.
>
> >
> >> bless $r_Album, 'Album';
> >
> >
> > og så endelig 'bless $slef, $class' som andre også foreslår.
> >
> Yes!
>
> >
> >> return $r_Album;
> >>} # constructor
> >
> >
> > Rent stilistisk plejer jeg ikke at skrive den sidste
> > return-sætning. Perl returnerer automatisk resultatet af den sidste
> > sætning.
> >
> > Det er et smagsspørgsmål om man kan lide det eller ej. Der er nogle
> > der insisterer meget fast på at alle funktioner skalafsluttes med
> > return.
> >
> Man kan ikke diskutere smag, men jeg synes også, at subroutinens sidste
> udtryk er OK som returværdi.
>
> >
> >>sub albumartist
> >>{
> >
> >
> > Jeg fatter stadigvæk ikke hvad pointen med denne funktion er.
> >
> Den lægger den første gruppe på albummet ind i $class->{groups}->[0].
> I $class->{groups}->[$t] lægges gruppen, der udfører nummeret på track
> $t på albummet.
>
> >
> >>Jeg benyttede en notation fra en bog, hvor det anvendes som en
> >>konvention, der viser, at vi har med private data at gøre.
> >>Men er alle klassens data ikke det?
> >
> >
> > Jo. Det er også privat hvorvidt du implementerer dit objekt som en
> > arrayref eller en scalarref.
> >
> >
> >>Jeg har set eksempler, hvor der anvendes lutter store bogstaver, og
> >>der er også kommentarer om anvendelse af blanding af store og små
> >>bogstaver i forhold til konventioner i Perl's egen kode.
> >
> >
> > 'perldoc perlstyle' giver en række stilistiske råd. Den skriver ikke
> > decideret noget om objekter, men skriver som noget af det sidste om
> > store og små bogstaver.
> >
> Fint, den læser jeg nu.
>
> Må jeg lige igen spørge til, hvordan jeg kan bestemme størrelsen af
> arrayet $class->{groups}.
>
Der er forskellige måder at gøre det på. Du kan "tvinge" en array variabel
i scalar context ved at bruge scalar:
$antal_elementer = scalar @{ $class->{groups} }
eller regne indekset til sidste element i array'et ud på følgende måde:
$sidste_indeks = $#{ $class->{groups} }
Hvis $class->{groups} er tom, returnerer ovenstående -1.
> Jeg har prøvet at indsætte en stump kode for at benytte en simpel
> reference til et array, hvor jeg kan, det jeg vil, men jeg kan ikke
> oversætte det til objekt-notationen.
> ------------------------------------
> Album.pm
> --------
> sub new
> {
> my $class = shift;
>
> my $this =
> {
> "name" => undef,
> "id" => undef,
> "dbname" => undef,
> "released" => undef,
> "groups" => []
> };
>
> bless $this, $class;
> } # constructor
>
> mymusic.pl
> ----------
> my @anArray;
> my $rArray = sslug@sslug;
> $anArray[4] = 3;
>
> print FH "element four of rArray: ".$$rArray[4]."\n";
> print FH "element zero of groups: "
> .$album->{groups}->[0]->name()."\n";
> print FH "size of rArray: ".scalar(@$rArray)."\n";
> print FH "size of groups: ".scalar($album->{groups})."\n";
Her har vi balladen: Du glemmer at dereferere $album->{groups} som vist i
min kommentar ovenfor.
>
> FH
> --
> element four of rArray: 3
> element zero of groups: Canned Heat
> size of rArray: 5
> size of groups: ARRAY(0xbf655c)
> ------------------------------------
>
> Når jeg skal udskrive et element i et array ved anvendelse af referencen
> skal jeg jo skrive '$$', og når jeg skal benytte referencen som et array
> (i scalar), skal jeg skrive '@$'.
> Jeg kan ikke på samme måde skifte første '$' ud med '@', når jeg
> arbejder med objektet.
> Hvordan får jeg størrelsen på arrayet $class->{groups}?
>
> mvh
> Jan
>
>
--
-------------------------------------------
Cand.scient. Anders Sønderberg Mortensen
Dronning Olgas Vej 55A, st.tv.
DK-2000 Frederiksberg
DENMARK
Phone: + 45 38 86 57 20
-------------------------------------------
 |
 |
 |
| |
|
|
 |
| |
|
Henvendelse vedrørende websiderne til <www_admin>.
|
Senest ændret
2005-08-10, klokken 19:54
Denne side vedligeholdes af
MHonArc
.
|
|
|
 |
 |
 |