In Scala, cosa significa esattamente 'val a: A = _' (trattino basso)?


Risposte:


143

val a: A = _è un errore di compilazione. Per esempio:

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

Ciò che funziona è var a: A = _(nota varinvece di val). Come dice Chuck nella sua risposta, questo inizializza la variabile a un valore predefinito. Dalla specifica del linguaggio Scala:

0 se T è Int o uno dei suoi tipi di sottointervallo,
0L se T è Long,
0.0f se T è Float,
0.0d se T è Double,
false se T è Boolean,
() se T è Unit,
null per tutti gli altri tipi T.


6
Ah, bella presa sull'interruttore val / var. Il mio cervello ci ha appena sfiorato.
Chuck

2
Qualche idea sul motivo per cui questo non è stato fatto per funzionare val?
Erik Kaplun

4
@ ErikAllik: Questa è pura speculazione, ma val a: Int = _probabilmente è un errore di compilazione perché sarebbe una cattiva pratica se funzionasse. Sarebbe solo un modo offuscato di scrivere val a: Int = 0. L'impostazione di a varsu un valore predefinito ha senso poiché varsi prevede che a cambi, ma a valè fisso, quindi la migliore pratica sarebbe assegnare un valore in modo esplicito.
Shuklaswag

1
@ Shuklaswag: solo se sai che è un numero intero. Sto cercando di usarlo per inizializzare un val di un tipo che ancora non conosco.
Adrian May

33

Si inizializza aal valore predefinito del tipo A. Ad esempio, il valore predefinito di un Int è 0 e il valore predefinito di un tipo di riferimento è null.


10
Qual è il valore predefinito di una classe che mescola il NotNulltratto? :-)
Jean-Philippe Pellet

9
@ Jean-PhilippePellet: A partire da Scala 2.9.0.1 (che è la versione più recente che ho usato), il valore predefinito di una classe che mescola il tratto NotNull è - pausa drammatica - null . Mi aspetto che questo probabilmente cambierà ad un certo punto, ma attualmente sembra _briscola NotNull.
Chuck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.