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.