Vraag Wat is in Scala een "vroege initializer"?


In Martin Odersky's recente bericht over niveaus van programmeur vermogen in Scala, in de Expert bibliotheekontwerper sectie, hij omvat de term "vroege initializers".

Deze worden niet genoemd in Programmeren in Scala. Wat zijn ze?


58
2018-01-17 11:07


oorsprong


antwoorden:


Vroege initializers maken deel uit van de constructor van een subklasse die bedoeld is om vóór zijn superklasse te draaien. Bijvoorbeeld:

abstract class X {
    val name: String
    val size = name.size
}

class Y extends {
    val name = "class Y"
} with X

Als de code in plaats daarvan is geschreven als

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

dan zou een nul-wijzeruitzondering optreden wanneer Z werd geïnitialiseerd, omdat size is eerder geïnitialiseerd name in de normale volgorde van initialisatie (superklasse voor klasse).


92
2018-01-17 18:03



Voor zover ik kan zien, is de motivatie (zoals gegeven in de link hierboven):

"Natuurlijk, wanneer een val wordt onderdrukt, wordt deze niet meer dan één keer geïnitialiseerd. Dus hoewel x2 in het bovenstaande voorbeeld schijnbaar op elk punt is gedefinieerd, is dit niet het geval: een overschreven waarde zal nul lijken te zijn tijdens de constructie van superklassen, net als een abstracte val. "

Ik zie niet in waarom dit helemaal natuurlijk is. Het is volledig mogelijk dat de r.hs. van een opdracht kan een bijwerking hebben. Merk op dat een dergelijke codestructuur volledig onmogelijk is in C ++ of Java (en ik zal Smalltalk raden, hoewel ik niet voor die taal kan spreken). In feite moet je zulke dubbele toewijzingen impliciet maken ... ticilpmi ... Uitzonderlijk in die talen via constructors. In het licht van de r.hs. neveneffect onzekerheid, het lijkt echt helemaal geen motivatie: het vermogen om superclass bijwerkingen te omzeilen (waardoor superklasse invarianten ongeldig worden) via OPDRACHT? Ick!

Zijn er andere 'moordenaar'-redenen om zo'n onveilige codestructuur toe te staan? Object-georiënteerde talen hebben ongeveer 40 jaar zonder zo'n mechanisme gedaan (30-oneven jaren, als je meetelt bij het creëren van de taal), waarom zou je het nu opnemen?

Het ... gewoon ... lijkt ... gevaarlijk.


2
2017-10-15 15:15



Bij nader inzien, een jaarlaag ...

Dit is maar cake. Letterlijk.

Niet een vroege iets. Gewoon taart (mixins).

Cake is een term / patroon bedacht door The Grand Pooh-bah zelf, een die gebruik maakt van Scala's karaktertreksysteem, dat zich halverwege tussen een klasse en een interface bevindt. Het is veel beter dan het decoratiepatroon van Java.

De zogenaamde "interface" is slechts een naamloze basisklasse, en wat de basisklasse was, fungeert als een eigenschap (wat ik eerlijk gezegd niet wist dat het gedaan kon worden). Het is mij onduidelijk of een "with'd" -klasse argumenten kan aannemen (eigenschappen kunnen dit niet), het zal proberen en rapporteren.

Deze vraag en het antwoord is in een van de coolste functies van Scala gestapt. Lees het door en wees onder de indruk.


1
2017-11-20 17:21