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.