Dans Scala, que signifie exactement «val a: A = _» (trait de soulignement)?

120

À quoi val a: A = _initialise exactement une valeur? Est-ce un null typé? Merci.

Gregor Scheidt
la source
2
Soupe aux symboles de Scala .
Shelby Moore III

Réponses:

143

val a: A = _est une erreur de compilation. Par exemple:

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

Ce qui fonctionne est var a: A = _(notez varau lieu de val). Comme Chuck le dit dans sa réponse, cela initialise la variable à une valeur par défaut. À partir de la spécification du langage Scala:

0 si T est Int ou l'un de ses types de sous-
plages , 0L si T est Long,
0.0f si T est Float,
0.0d si T est Double,
false si T est Boolean,
() si T est Unit,
nul pour tous les autres types T.

Paul Boucher
la source
6
Ha, belle prise sur le switch val / var. Mon cerveau est passé juste devant.
Chuck
2
Un aperçu de la raison pour laquelle cela n'a pas été conçu pour fonctionner val?
Erik Kaplun
4
@ErikAllik: C'est de la pure spéculation, mais val a: Int = _c'est probablement une erreur de compilation car ce serait une mauvaise pratique si cela fonctionnait. Ce ne serait qu'une manière obscure d'écrire val a: Int = 0. Définir a varsur une valeur par défaut a du sens car varon s'attend à ce que a change, mais a valest fixe, la meilleure pratique serait donc d'attribuer une valeur explicitement.
Shuklaswag le
1
@Shuklaswag: Uniquement si vous connaissez son entier. J'essaye d'utiliser ceci pour initialiser un val d'un type que je ne connais pas encore.
Adrian mai
33

Il s'initialise aà la valeur par défaut du type A. Par exemple, la valeur par défaut d'un Int est 0 et la valeur par défaut d'un type de référence est null.

Mandrin
la source
10
Quelle est la valeur par défaut d'une classe qui se mélange au NotNulltrait? :-)
Jean-Philippe Pellet
9
@ Jean-PhilippePellet: Depuis Scala 2.9.0.1 (qui est la version la plus récente que j'ai utilisée), la valeur par défaut d'une classe qui se mélange dans le trait NotNull est - pause dramatique - null . Je pense que cela changera probablement à un moment donné, mais actuellement, cela semble être un _atout NotNull.
Chuck