Scala comportamiento extraño en la clase / inicialización de objetos [duplicado]
Posible duplicado:
Scala y referencias avanzadas.
¿Hay alguna razón por la que los siguientes trabajos en Scala:
Versión 1object Strange extends App {
val x = 42
Console.println(x) // => outputs "42", as expected
}
Versión 2object Strange extends App {
Console.println(x) // => "0" ?!
val x = 42
}
Porque lo hacecompilar en absoluto y por qué se comporta tan raro sinalguna advertencias o lo que sea?
También es el mismo problema conclass
:
class StrangeClass {
Console.println(x) // => still "0"
val x = 42
}
object TestApp extends App {
new StrangeClass()
}
No hay tal problema con el cuerpo del método regular:
def nonStrangeMethod {
Console.println(y) // => fails with "not found: value y", as expected
y = 42
}
Y el comportamiento cambia drásticamente si añadiéramos "final" a la declaración val:
class StrangeClass {
Console.println(x) // => "42", but at least that's expected
final val x = 42
}
Para los registros, el siguiente Java estático (de Scalaobject
) contrapartida:
public class Strange {
static {
System.out.println(x);
}
static int x = 42;
public static void main(String[] args) {}
}
falla la compilación con un error simple y comprensible "No se puede hacer referencia a un campo antes de que se defina" en la línea # 3 y Java no estático (Scala'sclass
) contrapartida:
public class Strange {
Strange() {
System.out.println(x);
int x = 42;
}
public static void main(String[] args) {
new Strange();
}
}
obviamente falla con "x no se puede resolver en una variable" en la línea # 3.