¿Por qué en este ejemplo, no se produce ningún error y b termina manteniendo el valor predeterminado?Inicialización de los valores de Scala
scala> val b = a; val a = 5
b: Int = 0
a: Int = 5
¿Por qué en este ejemplo, no se produce ningún error y b termina manteniendo el valor predeterminado?Inicialización de los valores de Scala
scala> val b = a; val a = 5
b: Int = 0
a: Int = 5
Al hacer esto en el REPL, que está haciendo con eficacia:
class Foobar { val b = a; val a = 5 }
b y a son asignados a fin, por lo que en el momento cuando se está asignando b, existe una campo a, pero todavía no se ha asignado, por lo que tiene el valor predeterminado de 0. En Java, no puede hacer esto porque no puede hacer referencia a un campo antes de que se defina. Creo que puedes hacer esto en Scala para permitir la inicialización lenta.
Esto se puede ver con mayor claridad si se utiliza el siguiente código:
scala> class Foobar {
println("a=" + a)
val b = a
println("a=" + a)
val a = 5
println("a=" + a)
}
defined class Foobar
scala> new Foobar().b
a=0
a=0
a=5
res6: Int = 0
Usted puede tener los valores correctos asignados si haces aa método:
class Foobar { val b = a; def a = 5 }
defined class Foobar
scala> new Foobar().b
res2: Int = 5
o se puede hacer ba perezoso val:
scala> class Foobar { lazy val b = a; val a = 5 }
defined class Foobar
scala> new Foobar().b
res5: Int = 5
¿No debería Scalac emitir una advertencia en tales situaciones? Ya que parece ser un error seguro y, probablemente, dará lugar a errores graciosos a veces. – Rogach
@Rogach, supongo que podría ser una advertencia en el compilador de Scala, pero puede ser útil, especialmente. para la evaluación perezosa Más en el ámbito de un verificador de estilos como scalastyle (https://github.com/scalastyle/scalastyle) –
@Rogach Detectar tales situaciones de manera confiable es difícil, si no imposible. Scalac probablemente tendrá una advertencia para casos simples. –