scala REPL 和 Intellij 中的 val 行为

val behavior in scala REPL and Intellij

正如预期的那样,重新分配在 REPL

中给出如下错误
scala> val a=1
a: Int = 1

scala> a=2
<console>:12: error: reassignment to val
       a=2
        ^

但是当 a=2 以 val.

开头时,下面的重新分配不会在 REPL 中给出错误
scala> val a=1
a: Int = 1

scala> val a=2
a: Int = 2

当我在 Intellij 中执行以下代码时出现错误。

object Test {
  def main(args: Array[String]) {
    val x = 1
    val x = 2
  }
}

为什么 val a=1val a=2 在 REPL 中没有给出任何错误(如果只有 a=2 则出错)但在 Intellij 中出错。

来自Scala docs REPL overview

  • every line of input is compiled separately.
  • dependencies on previous lines are included by automatically generated imports.

结合这两个事实,我们可以理解它们不在同一个命名空间中,这与您提供的示例不同,其中 2 个名为 x 的变量在同一个 class.[=13= 中]

REPL 用于快速 friction-less 实验。如果您只是因为在 val a = 23.

时不小心输错了 val a = 32 而不得不从头开始,那将是 非常 烦人的

因此,REPL 的设计方式看起来看似 违反了 Scala 的规则,但实际上并没有。 实际编译的代码对应于您输入的代码看起来有点像这样:

object line {
  val a=1
}

object line {
  import line._
  val a=2
}