En Scala, ¿qué significa exactamente 'val a: A = _' (guión bajo)?


Respuestas:


143

val a: A = _es un error de compilación. Por ejemplo:

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

Lo que funciona es var a: A = _(nota en varlugar de val). Como dice Chuck en su respuesta, esto inicializa la variable a un valor predeterminado. De la especificación del lenguaje Scala:

0 si T es Int o uno de sus tipos de subrango,
0L si T es Long,
0.0f si T es Float,
0.0d si T es Doble,
falso si T es Booleano,
() si T es Unidad,
nulo para todos los demás tipos T.


6
Ha, buena captura en el interruptor val / var. Mi cerebro pasó por encima de él.
Chuck

2
¿Alguna idea de por qué no se ha hecho funcionar con esto val?
Erik Kaplun

4
@ErikAllik: Esto es pura especulación, pero val a: Int = _probablemente sea un error de compilación porque sería una mala práctica si funcionara. Sería una forma de escribir confusa val a: Int = 0. Establecer vara en un valor predeterminado tiene sentido ya que varse espera que a cambie, pero a vales fijo, por lo que la mejor práctica sería asignar un valor explícitamente.
Shuklaswag

1
@Shuklaswag: Solo si sabes que es un número entero. Estoy tratando de usar esto para inicializar un val de un tipo que aún no conozco.
Adrian May

33

Se inicializa acon el valor predeterminado del tipo A. Por ejemplo, el valor predeterminado de un Int es 0 y el valor predeterminado de un tipo de referencia es nulo.


10
¿Cuál es el valor predeterminado de una clase que se mezcla en el NotNullrasgo? :-)
Jean-Philippe Pellet

9
@ Jean-PhilippePellet: A partir de Scala 2.9.0.1 (que es la versión más reciente que he usado), el valor predeterminado de una clase que se mezcla en el rasgo NotNull es - pausa dramática - nulo . Espero que esto probablemente cambie en algún momento, pero actualmente parece _triunfar NotNull.
Chuck
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.