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.