In diesem Beispiel ist es etwas schwierig zu sehen, dass der new Actor
als so genannter "by name" -Parameter übergeben wird. Stellen Sie sich vor, dass es in eine Funktion des Typs () => Actor
umgewandelt wird. Diese Funktion wird jedes Mal aufgerufen, wenn der Akteur bei einem Neustart von seinem Supervisor neu angelegt wird.
Das Problem ist, dass diese Funktion eine "closure" (sehr einfach zu Google;)) ist, was bedeutet, dass es alles im umgebenden Bereich erfasst und merkt (manchmal, aber sehr selten als "Stack-Ripping" bezeichnet) "). ZB val f = (a: Int) => a + x
. Woher kommt die x
? Es kommt von dem umgebenden Umfang. Die Funktion liteal, die f
zugewiesen ist, wird als "offener Begriff" bezeichnet. Zur Laufzeit wird das Funktionsliteral zu einem Funktionswert (das ist eine originelle Art, "Objekt" zu sagen), der bei der Ausführung den offenen Term schließt, während alles im umgebenden Bereich erfasst wird. Von dort kommt der Name "closure".
Verschlüsse sind sehr, sehr nützlich, aber Sie müssen vorsichtig sein, was Sie zu schließen. Manchmal x
ist ein def
oder Gott bewahre eine var
, die zu unvorhersehbaren Ergebnissen für f
führt, weil Sie keine Kontrolle über die Zeit haben, wenn f
aufgerufen/ausgeführt wird. Versuch es!
Zwei sehr häufig anti paterns in Akka sind/waren:
- Schließen über (die äußere)
this
Referenz, wenn ein Schauspieler von einer inneren Klasse zu schaffen.
- Schließen über
def sender
beim Antworten auf eine Nachricht mit Zukunft.
Ich habe Ihnen ein paar ausgefallene Begriffe zu Google absichtlich, btw;)
Prost und glücklich Codierung
Dank. Reiche Erklärung. – Peter