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=1
和 val a=2
在 REPL 中没有给出任何错误(如果只有 a=2 则出错)但在 Intellij 中出错。
- 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
}
正如预期的那样,重新分配在 REPL
中给出如下错误scala> val a=1
a: Int = 1
scala> a=2
<console>:12: error: reassignment to val
a=2
^
但是当 a=2
以 val.
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 中出错。
- 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
}