Schrift
[thread]11756[/thread]

Zugriff auf Membervariable aus Instanzmethode? (Seite 2)



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Struppi
 2008-05-06 13:25
#109249 #109249
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
JackBauer+2008-05-06 11:10:43--
Code: (dl )
1
2
3
4
5
6
sub getSum()
{
$_[0] + $_[1];
}

$x = getSum(2, 3);

Naja, du nutzt hier die Tatsache, das Perl als Rückgabewert auch das Ergebnis der letzten Operation nutzt, das ist in so einem Fall aber nicht schön und wie du schon sagst unübersichtlich, es gibt ja auch return in Perl.

Diese Eigenschaft wird oft genutzt, um explizit einen wahren oder unwahren Rückgabewert zu erwingen:

Code: (dl )
1
2
3
4
5
6
7
sub Beispiel{
.... #
tu_was();
if($fehler) return 0;
tu_was();
1;
}


So ist gesichert, dass die Funktion im Erfolgsfall immer wahr zurückgibt.

Das getSum Beispiel würde in der Praxis vermutlich eher so aussehen:
Code: (dl )
1
2
3
4
5
6
7
sub getSum
{
my $a = shift;
my $b = shift;
return $a + $b;
}
my $x = getSum(2, 3);
KurtZ
 2008-05-06 14:55
#109257 #109257
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
JackBauer+2008-05-06 10:46:02--
Momentan weiß ich noch nicht so recht, was ich von Perl halten soll. Ich sehe jedenfalls absolut keinen Sinn darin Methoden kurz aber kryptisch zu designen, sodass anschließend bei schlechter Dokumentation keiner mehr weiß, was überhaupt gemacht wurde:


doch es macht gelegentlich Sinn, wenn man weiß was man macht!
Guter, anerkannter und häufigster Stil ist es aber folgende Schreibweise:

Code (perl): (dl )
1
2
3
4
sub getSum {
  my ($a,$b)=@_;
  return $a +$b;
}


außerdem solltest du hier die leere Klammern () bei Subs weglassen, (den Anfängerfehler hab ich früher auch gemacht)

Code (perl): (dl )
1
2
3
4
5
6
7
8
 
# statt
sub getSum ()   
   { $_[0] + $_[1] }
# lieber
sub getSum  
   { $_[0] + $_[1] }
# EDIT: hier versagt das Syntaxhighlighting des poard !!!


die leeren Klammern (siehe Prototypes in perlsub) sagen Perl dass er meckern soll wenn du die Routine mit Parameter aufrufst.

Falls es dich tröstet deine Kritik ist nicht neu und Anlass für Änderungen/Vereinfachungen die in Perl 6 bzgl. Parameterdeklarationen kommen sollen. (Perl trägt halt den historischen Balast mit sich, Strukturen und Vorteile mehrerer Vorgängersprachen gleichzeitig übernommen zu haben... EDIT: was es gleichzeitig mächtiger aber auch komplexer macht)
TMTOWTDYOG (there's more than one way to dig your own grave)
murphy
 2008-05-06 14:55
#109258 #109258
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Struppi+2008-05-06 11:25:35--
[...] Naja, du nutzt hier die Tatsache, das Perl als Rückgabewert auch das Ergebnis der letzten Operation nutzt, das ist in so einem Fall aber nicht schön und wie du schon sagst unübersichtlich, es gibt ja auch return in Perl. [...]


Hmm, das ist wohl eine Geschmacksfrage, aber ich persönlich finde eher return tendenziell unübersichtlich. Bei einer einzeiligen Funktion macht das natürlich keinen Unterschied, aber in komplexeren Funktionen wird return wie auch goto benutzt um einen nicht lokalen Kontrolltransfer auszulösen, der der syntaktischen Struktur des Programmes widersprechen kann. Das trägt in vielen Fällen nicht zur Übersicht bei. Nicht umsonst haben pur funktionale Sprachen in der Regel weder einen return- noch einen goto-Befehl...
When C++ is your hammer, every problem looks like your thumb.
KurtZ
 2008-05-06 15:02
#109259 #109259
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Conway rät kompliziertere Subs immer mit einem expliziten return abzuschließen, um zu vermeiden das versehentlich die Rückgabe einer letzten Aktion durchgereicht wird, die gar nicht bedacht war.
TMTOWTDYOG (there's more than one way to dig your own grave)
Struppi
 2008-05-06 15:09
#109260 #109260
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Mal abgesehen von Kurts Bemerkung, die ich leider auch aus eigener leidlicher Erfahrung kenne [nicht die Bemerkung, sondern den Inhalt], finde ich z.b. shift || return übersichtlicher, als verschlungene if-Bedingungen, aber das dürfte, wie so vieles beim programmieren, in erster Linie Geschmackssache und in zweiter Gewohnheit sein.
KurtZ
 2008-05-06 15:22
#109263 #109263
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
nepos+2008-05-06 11:10:44--
da z.B. direktes benutzen von $_ schneller ist, als eine extra Variable dafür anzulegen.

Insbesondere optimiert der Compiler IMHO zuweilen dann den Callframe weg und verwandelt ein kurzes Sub in schnellen Inline-Code wie bei einem Macro. (oder???)

NACHTRAG und nicht zu vergessen, die Elemente von @_ sind Aliases auf die übergebenen Variablen, mit $_[0]="neu" verändere ich sie!!!
TMTOWTDYOG (there's more than one way to dig your own grave)
KurtZ
 2008-05-06 15:33
#109267 #109267
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
JackBauer+2008-05-06 10:26:37--
Was ist denn inhaltlich der Unterschied zwischen $self->{reader} und $self->reader - sprich: was haben die geschweiften Klammern für eine Funktion?


Vielleicht hilft es dir weiter zu wissen dass ein Perl-Objekt intern nicht zwingend ein Hash sein muss.

Mittels bless verknüpfst ("segnest") du eine Datenstruktur mit einem Package.
Mit $self->reader rufst du eine routine reader im vernüpften Package auf.

$self ist aber nur eine Referenz auf eine Datenstruktur, das wissen ob es sich diesmal um ein Hash handelt solltest du aber in der Klasse als Interna kapseln und nicht nach außen tragen. Vielleicht willst du ja eines Tages die Datenstruktur ändern ...
TMTOWTDYOG (there's more than one way to dig your own grave)
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2008-05-06 12:13.