【问题标题】:val behavior in scala REPL and Intellijscala REPL 和 Intellij 中的 val 行为
【发布时间】:2021-02-16 09:34:47
【问题描述】:

正如预期的那样,重新分配在 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 中出现错误。

【问题讨论】:

  • REPL 允许您使用新值隐藏旧定义,这对于实验很有用,但可能导致代码晦涩难懂,这就是为什么这只适用于 复制。 - 顺便说一句,注意你也可以在代码中模拟这种行为{ val x = 1 { val x = 2 } }注意内部块,每个块都可以隐藏以前定义的变量,但是一旦你退出块,旧变量就会再次存在。

标签: scala read-eval-print-loop scala-repl


【解决方案1】:

来自Scala docs REPL overview

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

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

【讨论】:

    【解决方案2】:

    REPL 旨在用于快速无摩擦实验。 非常如果你不得不从头开始只是因为你在你的意思是val a = 23时不小心输错了val a = 32,那会很烦人。

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

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

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2018-08-15
      • 1970-01-01
      相关资源
      最近更新 更多