Em Scala, o que exatamente 'val a: A = _' (sublinhado) significa?

120

Para que exatamente val a: A = _inicializar um valor? Este é um nulo digitado? Obrigado.

Gregor Scheidt
fonte
2
Sopa de símbolos de Scala .
Shelby Moore III

Respostas:

143

val a: A = _é um erro de compilação. Por exemplo:

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

O que funciona é var a: A = _(observe em varvez de val). Como Chuck diz em sua resposta, isso inicializa a variável para um valor padrão. Na especificação de idioma Scala:

0 se T for Int ou um de seus tipos de subintervalos,
0L se T for Longo,
0,0f se T for Flutuante,
0,0d se T for Duplo,
falso se T for Booleano,
() se T for Unidade,
nulo para todos os outros tipos T.

Paul Butcher
fonte
6
Ha, boa captura no switch val / var. Meu cérebro passou rapidamente por ele.
Chuck
2
Alguma idéia de por que isso não foi feito para funcionar val?
Erik Kaplun
4
@ErikAllik: Isso é pura especulação, mas val a: Int = _provavelmente é um erro de compilação, porque seria uma prática ruim se funcionasse. Seria apenas uma maneira ofuscada de escrever val a: Int = 0. Definir a varcomo um valor padrão faz sentido, pois varespera-se que a alteração seja alterada, mas a valé corrigida, portanto, a melhor prática seria atribuir um valor explicitamente.
Shuklaswag
1
@Shuklaswag: Somente se você souber que é um número inteiro. Estou tentando usar isso para inicializar um valor de um tipo que ainda não conheço.
11897 Adrian May
33

Inicializa acom o valor padrão do tipo A. Por exemplo, o valor padrão de um Int é 0 e o valor padrão de um tipo de referência é nulo.

Mandril
fonte
10
Qual é o valor padrão de uma classe que mistura na NotNullcaracterística? :-)
Jean-Philippe Pellet
9
@ Jean-PhilippePellet: A partir do Scala 2.9.0.1 (que é a versão mais recente que usei), o valor padrão de uma classe que se mistura na característica NotNull é - pausa dramática - nula . Espero que isso provavelmente mude em algum momento, mas atualmente parece _trunfo NotNull.
Chuck