scala REPL和Intellij中的val行为

问题描述

由于预期的重新分配导致REPL中出现以下错误

df$Type[grepl("GaraGE|PARKING|LOT",df$Name)]<-"Parking&Garage"

但是当scala> val a=1 a: Int = 1 scala> a=2 <console>:12: error: reassignment to val a=2 ^ 前面带有val时,以下重新分配不会在REPL中产生错误

a=2

当我在Intellij中执行以下代码时,其给出错误

scala> val a=1
a: Int = 1

scala> val a=2
a: Int = 2

为什么object Test { def main(args: Array[String]) { val x = 1 val x = 2 } } val a=1在REPL中没有给出任何错误(如果仅为a = 2,则为错误),而在Intellij中则为错误

解决方法

来自Scala docs REPL overview

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

结合这两个事实,我们可以了解到它们不在同一个名称空间中,这与您提供的示例不同,两个名为$ hadoop fs -put /path/to/directory/000000_0 /path/to/directory/data.parquet 的变量在同一个类中。

,

REPL用于快速无摩擦实验。如果您只是因为您故意val a = 32时误输入了val a = 23而不得不从头开始,那会非常令人讨厌。

因此,REPL的设计方式使其具有打破Scala规则的外观,尽管实际上并没有。与您输入的代码相对应的经过实际编译的代码看起来像这样:

object line$1 {
  val a=1
}

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