Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala REPL和Intellij中的val行为_Scala_Read Eval Print Loop_Scala Repl - Fatal编程技术网

scala REPL和Intellij中的val行为

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 } }

正如预期的那样,重新分配在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
  }
}
为什么
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
  }
}