可能重复:
Scala和向前引用
是否有任何理由为什么在斯卡拉以下工作:
第1版
object Strange extends App {
val x = 42
Console.println(x) // => outputs "42", as expected
}
第2版
object Strange extends App {
Console.println(x) // => "0" ?!
val x = 42
}
为什么它编译于一切,为什么没有任何警告或任何行为如此怪异?
它也具有相同的问题class
:
class StrangeClass {
Console.println(x) // => still "0"
val x = 42
}
object TestApp extends App {
new StrangeClass()
}
有与普通方法的身体没有这样的问题:
def nonStrangeMethod {
Console.println(y) // => fails with "not found: value y", as expected
y = 42
}
和行为发生巨大变化,如果我们想补充“最后”为val声明:
class StrangeClass {
Console.println(x) // => "42", but at least that's expected
final val x = 42
}
为了记录,下面的Java静态(Scala的object
)对口:
public class Strange {
static {
System.out.println(x);
}
static int x = 42;
public static void main(String[] args) {}
}
失败的编译与平原和理解错误“无法引用之前它被定义字段,”上线3#和Java非静态(Scala的class
)对口:
public class Strange {
Strange() {
System.out.println(x);
int x = 42;
}
public static void main(String[] args) {
new Strange();
}
}
显然失败,“×不能被解析为一个变量”上线#3。