重複の可能性:
Scala と前方参照
以下が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 宣言に「final」を追加すると、動作が劇的に変わります。
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) {}
}
class
#3 行目と Java の非静的 (Scala の) 対応するエラー「定義される前にフィールドを参照できません」でコンパイルに失敗します。
public class Strange {
Strange() {
System.out.println(x);
int x = 42;
}
public static void main(String[] args) {
new Strange();
}
}
明らかに、3 行目の「x を変数に解決できません」で失敗します。