scala REPL和Intellij中的val行为
正如预期的那样,重新分配在REPL中给出了如下错误scala REPL和Intellij中的val行为,scala,read-eval-print-loop,scala-repl,Scala,Read Eval Print Loop,Scala Repl,正如预期的那样,重新分配在REPL中给出了如下错误 scala> val a=1 a: Int = 1 scala> a=2 <console>:12: error: reassignment to val a=2 ^ 当我在Intellij中执行下面的代码时,它给出了一个错误 object Test { def main(args: Array[String]) { val x = 1 val x = 2 } }
scala> val a=1
a: Int = 1
scala> a=2
<console>:12: error: reassignment to val
a=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中给出错误。来自:
- 每一行输入都是单独编译的
- 自动生成的导入包含对前几行的依赖关系
x
的变量在同一个类中。来自:
- 每一行输入都是单独编译的
- 自动生成的导入包含对前几行的依赖关系
结合这两个事实,我们可以理解它们不在同一名称空间中,这与您提供的示例不同,您提供的示例称为
x
的两个变量在同一个类中。REPL用于快速无摩擦实验。如果你只是因为无意中输入了val a=32
而不得不从头开始,这将是非常烦人的,因为你的意思是val a=23
因此,REPL的设计方式使其看起来似乎违反了Scala的规则,但实际上并没有。实际编译的代码与您输入的代码相对应,如下所示:
对象行$1{
val a=1
}
对象行$2{
进口行1美元_
val a=2
}
REPL用于快速无摩擦试验。如果你只是因为无意中输入了val a=32
而不得不从头开始,这将是非常烦人的,因为你的意思是val a=23
因此,REPL的设计方式使其看起来似乎违反了Scala的规则,但实际上并没有。实际编译的代码与您输入的代码相对应,如下所示:
对象行$1{
val a=1
}
对象行$2{
进口行1美元_
val a=2
}
REPL允许您用新值隐藏旧定义,这对实验很有用,但可能会导致代码模糊,这就是为什么这只适用于REPL。-顺便说一句,请注意,您也可以像这样在代码中模拟这种行为。{val x=1{val x=2}
请注意,在内部块中,每个块都可以对以前定义的变量进行阴影处理,但一旦退出该块,旧变量将再次存在。REPL允许您使用新值对旧定义进行阴影处理,这对实验很有用,但可能会导致代码模糊,这就是为什么这只适用于REPL。-顺便说一句,请注意,您也可以像这样在代码中模拟这种行为{val x=1{val x=2}
请注意内部块,每个块都可以隐藏以前定义的变量,但一旦退出块,旧变量将再次存在。
object Test {
def main(args: Array[String]) {
val x = 1
val x = 2
}
}