gpt4 book ai didi

class - 类/对象初始化中的 Scala 奇怪行为

转载 作者:行者123 更新时间:2023-12-02 22:22:19 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Scala and forward references

以下在 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) {}
}

在第 3 行和 Java 非静态(Scala 的 class)对应部分,编译失败并出现明显且可理解的错误“无法在定义字段之前引用它”:

public class Strange {
Strange() {
System.out.println(x);
int x = 42;
}

public static void main(String[] args) {
new Strange();
}
}

显然失败,第 3 行显示“x 无法解析为变量”。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com