Was genau macht Perls "Segen"?
Ich verstehe, nutzt man die "bless" - Schlüsselwort in Perl, die in einer Klasse der "neuen" Methode:
sub new {
my $self = bless { };
return $self;
}
Aber was genau ist "segnen" zu tun, die hash-Referenz ?
InformationsquelleAutor der Frage user47145 | 2008-12-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen
bless
Mitarbeiter ein Objekt mit einer Klasse.Wenn du jetzt eine Methode aufzurufen, die auf
$object
-, Perl-weiß, welches Paket die Suche nach der Methode.Wenn das zweite argument ausgelassen wird, wie in deinem Beispiel, das aktuelle Paket/die Klasse verwendet wird.
Um der Klarheit Willen, Ihr Beispiel könnte wie folgt geschrieben werden:
EDIT: Siehe kixx's gut Antwort für ein wenig mehr Details.
InformationsquelleAutor der Antwort Gordon Wilson
bless
Mitarbeiter eine Referenz, mit einem Paket.Ist es egal, was die Referenz ist, kann es sein, zu einem Hashwert (der häufigste Fall), um ein array (nicht so üblich), einen Skalar (in der Regel bedeutet dies ein inside-out-Objekt), mit einem regulären Ausdruck, Unterprogramm oder TYPEGLOB (siehe das Buch Object Oriented Perl: Ein Umfassender Leitfaden, um Konzepte und Programmiertechniken von Damian Conway für hilfreiche Beispiele) oder auch ein Verweis auf eine Datei oder ein Verzeichnis-handle (zuletzt häufiger der Fall).
Den Effekt
bless
-ing hat ist, dass es erlaubt, Sie gelten spezielle syntax, um das gesegnete Referenz.Wenn beispielsweise ein gesegnetes Referenz gespeichert ist, in
$obj
(verbunden durchbless
mit Paket "Klasse"), dann$obj->foo(@args)
wird eine Unterroutine aufrufenfoo
und übergeben Sie als erstes argument die Referenz$obj
gefolgt von dem rest der Argumente (@args
). Das Unterprogramm definiert werden sollte, im Paket "Klasse". Wenn keine Unterroutinefoo
im Paket "Klasse", eine Liste von anderen Paketen (form der array -@ISA
im Paket "Klasse") durchsucht und die erste Unterroutinefoo
gefunden werden genannt.InformationsquelleAutor der Antwort kixx
Kurze version: es ist die Markierung, die als hash an die aktuelle Paket-namespace (also, dass dieses Paket bietet seiner Klasse Umsetzung).
InformationsquelleAutor der Antwort chaos
Diese Funktion teilt die referenzierte Entität vom REF, dass es jetzt ein Objekt in die CLASSNAME-Paket, oder das aktuelle Paket falls KLASSENNAME weggelassen wird. Nutzung der zwei-argument-form segnen wird empfohlen.
Beispiel:
Rückgabewert
Diese Funktion liefert die Referenz auf ein Objekt gesegnet in CLASSNAME.
Beispiel:
Folgenden wird der Beispiel-code zeigt die grundsätzliche Nutzung, die die Objekt-Referenz wird erstellt, indem der Segen ein Verweis auf die Paket-s-Klasse −
InformationsquelleAutor der Antwort linuxtestside
Werde ich die Antwort hier, da die, die hier nicht ganz auf für mich.
Perl-bless-Funktion ordnet jeder Verweis auf alle Funktionen in einem Paket.
Warum müssten wir das?
Lassen Sie uns beginnen, indem man ein Beispiel in JavaScript:
Nun Streifen Weg die Klasse zu konstruieren und zu tun, ohne Sie:
Die Funktion nimmt eine hash-Tabelle der ungeordneten Eigenschaften(da es keinen Sinn macht zu haben, die zum schreiben von Eigenschaften in einer bestimmten Reihenfolge in dynamischen Sprachen in 2016) und gibt einen hash-Tabelle mit diesen Eigenschaften, oder wenn Sie vergessen haben, setzen Sie das Schlüsselwort new, wird es wieder die ganzen globalen Kontext(z.B. Fenster im browser oder global in nodejs).
Perl hat kein "dies" noch "neue", noch "Klasse", aber es kann immer noch eine Funktion, die verhält sich ähnlich. Wir müssen nicht ein Konstruktor noch ein Prototyp, aber wir werden in der Lage sein zu erstellen, neue Tiere und ändern Sie Ihre individuellen Eigenschaften.
Nun, wir haben ein problem: Was ist, wenn wir wollen, dass das Tier führen Sie die Töne, indem Sie sich stattdessen von uns drucken, was Ihre Stimme ist. Das heißt, wir wollen eine Funktion performSound, druckt das Tier seinen eigenen sound.
Einen Weg, dies zu tun ist durch den Unterricht jedes einzelne Tier, wie es Klang. Dies bedeutet, dass jede Katze hat Ihre eigene doppelte Funktion zu performSound.
Dies ist schlecht, weil performSound wird so eine völlig neue Funktion-Objekt jedes mal ein Tier aufgebaut ist. 10000 Tiere bedeutet 10000 performSounds. Wir wollen eine einzelne Funktion performSound, dass alle Tiere, sucht Ihren eigenen sound und druckt es.
Hier ist, wo die parallelen zu Perl ein bisschen anhält.
JavaScript neue Betreiber ist nicht optional, ohne es, "diese" inside-Objekt-Methoden korrumpiert globalen Gültigkeitsbereich:
Wollen wir eine-Funktion, die für jedes Tier, das aussieht bis das Tier den eigenen sound statt hardcoding es bei der Konstruktion.
Segen lässt uns ein Paket benutzen, wie der Prototyp der Objekte. Auf diese Weise, das Objekt bewusst ist, das "Paket" - es ist "auf", und wiederum können die Funktionen im Paket "erreicht in" die spezifische Instanzen, die erstellt wurden, aus dem Konstruktor der "Paket-Objekt":
Zusammenfassung/TL;DR:
Perl hat keine "dieser", "Klasse", noch "neue". Segen eines Objekts zu einem Paket bietet das Objekt eine Referenz auf das Paket, und beim aufrufen von Funktionen in das Paket, Ihre Argumente werden ausgeglichen durch 1 slot, und das erste argument($_[0] oder shift) entspricht javascript ist "das". In der turn, können Sie etwas simulieren, JavaScript, prototype model.
Leider macht es unmöglich(nach meinem Verständnis) um "neue Klassen zur Laufzeit, wie Sie benötigen, jede "Klasse" ein eigenes Paket, in der Erwägung, dass in javascript, müssen Sie nicht die Pakete an alle, die als "neue" Schlüsselwort macht eine anonyme hashmap für Sie zu nutzen, wie ein Paket zur Laufzeit können Sie neue Funktionen hinzufügen und entfernen von Funktionen on the fly.
Dort sind einige Perl-Bibliotheken erstellen Ihre eigene Art und Weise der überbrückung dieser Einschränkung in der Aussagekraft, wie Elche.
Warum die Verwirrung?:
Weil der Pakete. Unsere intuition sagt uns, binden Sie das Objekt an eine hashmap mit seinen " Prototypen. Dies ermöglicht es uns, erstellen Sie "Pakete" zur Laufzeit wie JavaScript können. Perl nicht über eine solche Flexibilität(zumindest nicht eingebaut, Sie haben, Sie zu erfinden oder es aus anderen Modulen), und im Gegenzug die Laufzeit Ausdruckskraft behindert wird. Man nennt es "segnen" ist nicht viel begünstigt weder.
Was wir tun wollen:
Etwas wie dieses, aber verbindlich, um den Prototyp der Karte rekursive und werden implizit an das Vorbild, anstatt Sie explizit zu machen.
Hier ist ein naiver Versuch: das Problem ist, dass "aufrufen" nicht wissen", was es genannt", so kann es genauso gut ein universal-perl-Funktion "objectInvokeMethod(Objekt, Methode)", die prüft, ob das Objekt die Methode, oder dessen Prototyp ist, oder dessen Prototyp hat es, bis es das Ende erreicht, und findet es, oder nicht (prototypische inheritence). Perl hat schöne eval Magie zu tun, aber ich überlasse, die für etwas, was ich versuchen zu tun können, später.
Egal, hier ist die Idee:
Trotzdem hoffentlich jemand finden diesen Beitrag nützlich.
InformationsquelleAutor der Antwort Dmitry
Ich Folgenden Gedanken leiten die Entwicklung der objektorientierten Perl.
Segnen verknüpfen jede Datenstruktur, die Referenz mit einer Klasse. Da, wie Perl erstellt die Vererbung von Struktur (in einer Art von Baum) ist es leicht zu nehmen Vorteil des Objektmodells zum erstellen von Objekten für die Komposition.
Zu diesem Verband, wir nannten Objekt zu entwickeln, immer im Hinterkopf haben, dass der interne Zustand des Objekts und die Klasse Verhalten sind getrennt. Und Sie segnen kann/erlauben, alle Daten Referenz zu verwenden-Paket/Klasse Verhalten.
Da das Paket kann verstehen, "der emotionale" Zustand des Objekts.
InformationsquelleAutor der Antwort Steven Koch
Zum Beispiel, wenn Sie sicher sein können, dass jeder Fehler Objekt ein gesegnetes hash, Sie können (endlich!) füllen Sie den fehlenden code im Fehler::print_me Methode:
Nun, wenn die print_me-Methode aufgerufen wird, über eine Referenz auf hash, der ist gesegnet, die in der Fehler-Klasse, die $self variable extrahiert die Referenz, die war als erstes argument übergeben und dann die print-Anweisungen Zugriff auf die verschiedenen Einträge der seligen hash.
InformationsquelleAutor der Antwort Bimlesh Sharma