Was genau bedeutet in Scala 'val a: A = _' (Unterstrich)?


Antworten:


143

val a: A = _ist ein Kompilierungsfehler. Beispielsweise:

scala> val a: String = _
<console>:1: error: unbound placeholder parameter
       val a: String = _
                       ^

Was funktioniert, ist var a: A = _(Notiz varstatt val). Wie Chuck in seiner Antwort sagt, initialisiert dies die Variable auf einen Standardwert. Aus der Scala-Sprachspezifikation:

0 wenn T Int oder einer seiner
Unterbereichstypen ist , 0L wenn T Long ist,
0.0f wenn T Float ist,
0.0d wenn T Double ist,
false wenn T Boolean ist,
() wenn T Unit ist,
null für alle anderen Typen T.


6
Ha, schöner Haken am Val / Var-Schalter. Mein Gehirn überflog es einfach.
— Chuck

2
Gibt es einen Einblick, warum dies nicht funktioniert hat val?
— Erik Kaplun

4
@ErikAllik: Dies ist reine Spekulation, aber val a: Int = _wahrscheinlich ein Kompilierungsfehler, da es eine schlechte Praxis wäre, wenn es funktionieren würde. Es wäre nur eine verschleierte Schreibweise val a: Int = 0. Das Festlegen von a varauf einen Standardwert ist sinnvoll, da varerwartet wird, dass sich a ändert, a valjedoch festgelegt ist. Daher empfiehlt es sich, einen Wert explizit zuzuweisen.
— Shuklaswag

1
@ Shuklaswag: Nur wenn du weißt, dass es eine ganze Zahl ist. Ich versuche, damit einen Wert eines Typs zu initialisieren, den ich noch nicht kenne.
— Adrian Mai

33

Es wird aauf den Standardwert des Typs initialisiert A. Beispielsweise ist der Standardwert eines Int 0 und der Standardwert eines Referenztyps null.


10
Was ist der Standardwert einer Klasse, die das NotNullMerkmal mischt ? :-)
— Jean-Philippe Pellet

9
@ Jean-PhilippePellet: Ab Scala 2.9.0.1 (der neuesten Version, die ich verwendet habe) ist der Standardwert einer Klasse, die das NotNull-Merkmal mischt, - dramatische Pause - null . Ich gehe davon aus, dass sich dies wahrscheinlich irgendwann ändern wird, aber derzeit scheint es _Trumpf zu sein NotNull.
— Chuck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.