Thread Debugging Hilfe bei Can't use string ("1") as a subroutine ref while "strict refs" in use
(8 answers)
Opened by bianca at 2020-12-16 11:25 2020-12-20T09:32:03 bianca Dankeschön! Freut mich, daß jemand sich damit beschäftigt. 2020-12-20T09:32:03 bianca Also ich finde, Deine Postings im allgemeinen zeigen schon, daß Du in Perl doch recht fortgeschritten bist. Quote Tja, sozusagen. Vielleicht hätte ich noch beschreiben sollen, wie es zu dem Text gekommen ist: Ich hab' OOP über Python kennengelernt. Dann wollte ich auch wissen, wie man das in Perl macht. Ich hab' die Tutorials für Perl dazu gelesen (perldoc), und war davon völlig verwirrt. Irgendwann dachte ich, "Kann man das nicht einfach so machen, wie man das in Python macht?" Und als ich gemerkt hab', ja, das kann man sehr wohl, hatte ich das Gefühl, das müßte mal jemand mit diesem Ansatz aufschreiben. Und das hab' ich dann gemacht. In Python sieht Beispielskript 3 so aus: Code (python): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #!/usr/bin/python # coding: utf-8 # OOP-Beispielskript 3 class Lamp: def __init__(self, wattzahl = 40, name = "Standardlampe"): self.wattzahl = wattzahl self.name = name def zeigeWattzahl(self): print "'" + self.name + "' hat eine Birne mit " + str(self.wattzahl) + " Watt." lamp = Lamp(wattzahl = 11) lamp.zeigeWattzahl() In der "Klassenmagie" (das ist mein eigener Begriff, der ist also nicht offiziell) gibt es in Python nicht dieses "$classname" (oder "$class", wie es in manchen Büchern auch genannt wird). Wenn man in Perl die Variable ausgibt, zeigt sie den Namen der Klasse (des packages), also "Lamp". Bei dem "->new()"-Aufruf hat man den ja gar nicht explizit mitgegeben. Also ist das schon in gewisser Weise "Magie". Die Variable wird dann für "bless()" verwendet. Auch das, was "bless()" genau macht, ist für mich eher ein Geheimnis. Da ich das für meine Programme aber auch nicht brauche (ich kann es einfach benutzen), bin ich dem noch nicht im einzelnen nachgegangen. Vielleicht weiß also jemand anders mehr darüber. Quote Z.B. soll man in der OOP eigentlich nicht von außen auf die Attribute innerhalb einer Klasse zugreifen. Sondern man fragt bei einer Klasse nach dem Wert eines Attributs an, und die Klasse gibt einem den zurück. So eine Methode, die das macht, nennt man "Getter", und die hat dann sowas wie "return $self->{attribute};" am Ende (vgl. Zugriffsfunktion). Meist haben diese Methoden Namen wie "getValue()" oder dergleichen. Ich bin da aber nicht so streng und greife also auch manchmal von außen direkt auf die Attribute zu. Quote Oh, ja, das hatte ich gar nicht gesehen. Danke! Ich weiß auch gar nicht mehr, aus welchem Dokument ich diese Technik übernommen hatte. Es war wieder dieses Prinzip, daß Python einen Mechanismus dafür (für solche Standardparameter) hatte (siehe oben in dem Skript), und ich mich darüber freute, das auch in Perl machen zu können. Aber die 0 muß man abfangen, das ist richtig. Quote Das Neudefinieren von Methoden ist in der OOP eine gängige Technik. Man nennt das "Überladen". Deshalb gibt das wohl auch keine Warnung, weil es erwünscht ist. Ich weiß nicht, ob man einen Sicherheitsmechanismus einbauen könnte, ich mache das mit dem Überladen nicht so oft/gern. Man muß das wohl selber im Blick haben, denke ich. Quote Also, ich kenne das immer nur mit einem $self. Quote Ja, man kann Methoden von außen Argumente übergeben. %env scheint mir aber eine so allgemeine Variable zu sein, daß ich sie gleich bei "->new(\%env)" mitgeben und sie einem Attribut zuordnen würde, so daß %env dann in der ganzen Klasse bekannt ist. 2020-12-20T09:32:03 bianca Vielen Dank für Dein Lob und Dein Feedback! Einen schönen vierten Advent wünsche ich! Last edited: 2020-12-20 13:03:57 +0100 (CET) |