perl6 Unterschied zwischen segnen und neu

8
%Vor%

Ich finde den obigen Code, der Singleelton implementiert, frage ich mich, was der Unterschied zwischen bless und new in Perl6 ist?

%Vor%     
smith 26.02.2016, 21:52
quelle

2 Antworten

7

Denken Sie an bless als Infrastruktur, während new Teil der (anpassbaren) Schnittstelle ist.

Wenn Sie sich die Implementierung der Klasse Mu ansehen (die root des Klassensystems),% bless ruft nqp::create auf, den Low-Level-Konstruktor, und ruft BUILDALL auf, wodurch die Vererbungskette durchsucht wird, um die entsprechenden BUILD (sub-) Methoden aufzurufen initialisiere das Objekt. Der Standardwert new ruft wiederum bless auf.

So new ruft bless Aufrufe BUILDALL Aufrufe BUILD auf. Normalerweise sollten Sie bless und BUILDALL alleine lassen und new und BUILD für die Anpassung überschreiben. Beachten Sie auch, dass der Name new nur eine Konvention ist: Es ist eine normale Methode, die nichts Besonderes tut, außer bless aufzurufen.

    
Christoph 27.02.2016 16:08
quelle
4

Einfach ausgedrückt ist neu ein vollständiger Konstruktor und segnen ist ein minimalistischer Konstruktor.

Um das doco auf bless zu zitieren, ist bless ein ...

Untergeordnete Objektbaumethode als neu. Erstellt ein neues Objekt desselben Typs wie der Aufrufer, verwendet die benannten Argumente zum Initialisieren von Attributen und gibt das erstellte Objekt zurück. Sie können diese Methode beim Schreiben von benutzerdefinierten Konstruktoren verwenden:

%Vor%

... während neu ist ein ...

Standardmethode zum Konstruieren (Erstellen + Initialisieren) neuer Objekte einer Klasse. Diese Methode erwartet nur benannte Argumente, die dann verwendet werden, um Attribute mit gleichnamigen Accessoren zu initialisieren. Klassen können ihre eigene neue Methode zum Überschreiben dieses Standards bereitstellen.

New löst einen Objektkonstruktionsmechanismus aus, der in jeder Klasse einer Vererbungshierarchie Untermethoden namens BUILD aufruft, sofern diese existieren. Weitere Informationen finden Sie in der Dokumentation zur Objektkonstruktion .

Sehen Sie sich die Dokumentation zur Objektkonstruktion an, um die vollständige Geschichte zu erhalten, aber das kritische Bit ist;

Mu.new Calls Methode segne auf ihren Aufruf und übergibt alle genannten Argumente. bless erzeugt das neue Objekt und ruft dann die Methode BUILDALL darauf auf. BUILDALL führt alle Unterklassen in umgekehrter Methodenauflösungsreihenfolge durch (d.h. von Mu zu den meisten abgeleiteten Klassen) und prüft in jeder Klasse auf das Vorhandensein einer Methode namens BUILD. Wenn es existiert, wird es aufgerufen, wobei wiederum alle benannten Argumente von der Methode new an es übergeben werden.

In einer früheren Version dieser Antwort habe ich festgestellt, dass segne nicht die Klassenhierarchie durchläuft, die die Submethode BUILD wie oben beschrieben aufruft - das war falsch. .bless macht das Gleiche.

Also, wann benutzt du einen über den anderen? Wenn der Standard .new , der von der Klasse Mu bereitgestellt wird, nicht der gewünschte Konstruktor ist, würden Sie in Ihrer Klasse einen method new deklarieren, der .bless um das Objekt zu konstruieren, und dann würden Sie fortfahren, Attribute zu initialisieren und jene anderen Aufgaben auszuführen, die der Standard .new nicht tut.

    
Marty 27.02.2016 00:10
quelle

Tags und Links