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

120

Wofür genau wird val a: A = _ein Wert initialisiert? Ist das eine getippte Null? Vielen Dank.

Gregor Scheidt
quelle
2
Scalas Symbolsuppe .
Shelby Moore III

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.

Paul Butcher
quelle
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.

Futter
quelle
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