22 votos

Scala asignación de vals

¿Por qué no es posible tener esto:

def main(args:Array[String]) {
    val whatever:String // Have it uninitialized here

    if(someCondition) {
        whatever = "final value" // Initialize it here
    }
}

No entiendo por qué esto no debería ser legal. Sé que puedo hacer que sea un var, pero ¿por qué tenemos que inicializar el val exactamente cuando se declara? ¿No parece más lógico que sea capaz de inicializar más tarde?

38voto

Nicolas Payette Puntos 4496

Usted puede hacer:

  val whatever =
    if (someCondition)
      "final value"
    else
      "other value"

28voto

Kevin Wright Puntos 31665

La solución de Java es en realidad una solución para el problema de que no todas las expresiones de los valores de retorno, por lo que no se puede escribir esto en Java:

final String whatever = if (someCondition) {
    "final value"
} else {
    "other value"
}

Cada vez más, la tendencia en Java es utilizar el operador ternario en su lugar:

final String whatever = someCondition ? "final value" : "other value"

Que está muy bien para que el uso limitado de casos, pero totalmente insostenible una vez que comenzamos a lidiar con el interruptor de declaraciones y varios constructores.


Scala enfoque es diferente aquí. Todos en la construcción de objetos en última instancia, debe pasar a través de un único "primaria" constructor, todas las expresiones devolver un valor (incluso si es Unit, equivalente a Java Void), y la inyección de constructor está fuertemente favorecida. Esto se traduce en los gráficos de objeto de ser limpiamente construido como un Gráfico Acíclico Dirigido, y también funciona muy bien con los objetos inmutables.

Usted también quiere ser conscientes de que la declaración y la definición de variables en distintas operaciones es, en general, una mala práctica cuando se trabaja con múltiples hilos, y que podía dejar vulnerable a la exposición de los nulos y las condiciones de carrera cuando menos te lo esperas (aunque esto no es realmente un problema durante la construcción de objetos). Atómica en la creación de valores inmutables es sólo un aspecto de la forma en que los lenguajes funcionales ayuda a lidiar con la concurrencia.

También significa que el compilador de Scala puede evitar algunos de los muy complicado el análisis de flujo de la especificación del lenguaje Java.

Como se ha indicado anteriormente, la Scala Manera™ es:

val whatever =
  if (someCondition)
    "final value"
  else
    "other value"

Un enfoque que también se amplía a otras estructuras de control:

val whatever = someCondition match {
  case 1 => "one"
  case 2 => "two"
  case 3 => "three"
  case _ => "other"
}

Con un poco de Scala experiencia descubrirá que este estilo ayuda a que el compilador de ayuda de usted, y usted debe encontrar a ti mismo que la escritura de programas con menos bugs!

9voto

Max A. Puntos 1916

Uso lazy vals así:

def main(args:Array[String]) {
  lazy val whatever:String = if (someCondition) "final value" else "other value"

  // ...

  println(whatever) // will only initialize on first access
}

7voto

Alex Cruise Puntos 4809

En adición a lo que otros han dicho, tenga en cuenta que Java permite que "en blanco" final "variables", que es una característica de algo me olvida:

final Boolean isItChristmasYet;

if (new Date().before(christmas)) {
    isItChristmasYet = Boolean.FALSE;
} else {
    isItChristmasYet = Boolean.TRUE;
}

Sin embargo, gracias a los datos de análisis de flujo en el compilador javac no le permiten salir de su whatever variable no asignada si someCondition no tiene.

3voto

Jens Schauder Puntos 23468

Debido a que el propósito de 'val' es la señal para el lector (y el compilador): "Este valor permanecerá lo que se inicializa a hasta que sale de la existencia"

Esto no tiene mucho sentido sin la inicialización.

Por supuesto, uno podría imaginar algo como val(3), que permite tres asignacion a una variable, pero no creo que sería de mucha utilidad.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X