1

正如预期的那样,重新分配在 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=1并且val a=2在 REPL 中没有给出任何错误(如果它只是 a=2 则错误)但在 Intellij 中出现错误。

4

2 回答 2

4

来自Scala 文档 REPL 概述

  • 每行输入都是单独编译的。
  • 对前几行的依赖包含在自动生成的导入中。

结合这两个事实,我们可以理解它们不在同一个命名空间中,这与您提供的示例不同,其中 2 个被调用的变量x在同一个类中。

于 2020-11-03T17:33:08.890 回答
2

REPL 旨在用于快速无摩擦实验。如果您仅仅因为您的本意时不小心输入错误而不得不从头开始重新启动,那将是非常烦人的。val a = 32val a = 23

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

object line$1 {
  val a=1
}

object line$2 {
  import line$1._
  val a=2
}
于 2020-11-04T07:52:38.357 回答