case class Test(kind: Int) {
  val ifX = if (isX) "is X" else "not X"
  val isX = kind == 1
}

val test = Test(1)
println("ifX=%s, isX=%b".format(test.ifX, test.isX))

为什么打印此代码:
ifX =不是X,isX = true

当将“val ifX”移到“ifX”之前就可以了(打印ifX = is X)

编辑:我知道如何解决。我不明白为什么在这种情况下编译器不会发出警告或错误。

最佳答案

您正在假设顺序在scala中无关紧要。是的因为isX是一个变量值,并且在ifX运行时已定义,但是它的值仍未初始化,因此它是其类型的默认值(布尔值,所以为false)。

如果将isX重新定义为函数(def isX = ...),它将起作用。

这大致等效于以下Java:

class Test {
    String ifX;
    bool isX; // Defaults to false, its a primitive after all
    public Test(Int kind) {
        ifX = isX ? "is X" : "not X";
        isX = kind == 1;
    }
}

09-25 20:44