Was ist in Scala ein “früher Initializer”?

In Martin Oderskys jüngstem Beitrag über die Programmierfähigkeiten von Scala, in der Sektion Expert Library Designer , schließt er den Begriff “early initializers” ein .

Diese werden in Programmieren in Scala nicht erwähnt. Was sind Sie?

Frühe Initialisierer sind Teil des Konstruktors einer Unterklasse, die vor ihrer Oberklasse ausgeführt werden soll. Beispielsweise:

abstract class X { val name: String val size = name.size } class Y extends { val name = "class Y" } with X 

Wenn der Code stattdessen als geschrieben wurde

 class Z extends X { val name = "class Z" } 

dann würde eine Nullzeiger-Ausnahme auftreten, wenn Z initialisiert wurde, weil die size vor dem name in der normalen Reihenfolge der Initialisierung (Oberklasse vor der class) initialisiert wird.

Soweit ich das beurteilen kann, ist die Motivation (wie im obigen Link angegeben):

“Wenn ein val überschrieben wird, wird es natürlich nicht mehr als einmal initialisiert. Obwohl x2 im obigen Beispiel scheinbar an jedem Punkt definiert ist, ist dies nicht der Fall: Ein überschriebenes val erscheint während der Konstruktion von Superklassen als null. ebenso wie ein abstraktes Val. ”

Ich verstehe nicht, warum das überhaupt selbstverständlich ist. Es ist durchaus möglich, dass die rhs einer Aufgabe eine Nebenwirkung haben kann. Beachten Sie, dass eine solche Code-Struktur in C ++ oder Java völlig unmöglich ist (und ich werde Smalltalk erraten, obwohl ich für diese Sprache nicht sprechen kann). In der Tat müssen Sie solche Doppelzuweisungen implizit machen … ticilpmi … EXplicit in diesen Sprachen über Konstruktoren. Angesichts der Ungewissheit der Nebeneffekte scheint es wirklich keine große Motivation zu sein: die Fähigkeit, übergeordnete Nebeneffekte (und damit Superklassen Invarianten) durch ZUWEISUNG zu umgehen? Ick!

Gibt es andere “Killer” -Motivationen für eine solche unsichere Codestruktur? Objektorientierte Sprachen haben seit etwa 40 Jahren (30 Jahre, wenn man von der Erschaffung der Sprache ausgeht) auf einen solchen Mechanismus verzichtet, warum sollte man sie jetzt einbeziehen?

Es … scheint nur … gefährlich zu sein.

Auf den zweiten Gedanken, ein Jahr Schicht …

Das ist nur Kuchen. Buchstäblich.

Kein frühes ALLES. Einfach Kuchen (Mixins).

Cake ist ein Begriff / Muster, der von The Grand Pooh-bah selbst geprägt wurde. Er verwendet Scalas Merkmalssystem, das auf halbem Weg zwischen einer class und einer Schnittstelle liegt. Es ist viel besser als Javas Dekorationsmuster.

Die sogenannte “Schnittstelle” ist lediglich eine unbenannte Basisklasse, und was früher die Basisklasse war, fungiert als Merkmal (von dem ich ehrlich gesagt nicht wusste, dass es möglich wäre). Es ist mir unklar, ob eine “With’d” -class Argumente entgegennehmen kann (Traits kann nicht), wird es versuchen und zurückmelden.

Diese Frage und ihre Antwort haben sich in eine der coolsten functionen von Scala verwandelt. Lesen Sie darüber nach und seien Sie in Ehrfurcht.