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


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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.