为什么这个Scala代码在参数中赋值为val?

Dee*_*dey 43 scala

object Main {

  def main(args: Array[String])
  {
    val x = 10
    print(x="Hello World")
    print(x)
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:Hello World10

我们知道,在Scala val中,无法重新分配或更改,但这里x正在改变

你好,世界

打印时.

Sum*_*uma 71

解释是出乎意料的:print有一个名为的参数x.使用x = ...用途命名的参数,因此print(x="Hello World")是一样的print("Hello World").

请参阅Scala Predef文档Predef.scala源代码:

object Predef /*....*/ {

/*....*/
  def print(x: Any) = Console.print(x)

/*....*/
}
Run Code Online (Sandbox Code Playgroud)

注意:这已在Scala内部邮件列表中讨论过:

Scala目前试图明智地将"x = e"视为命名参数或赋值......这对用户来说可能是令人惊讶的....

提案:我们弃用参数列表中的赋值

对此也存在问题SI-8206,该变化可能在Scala 2.13的问题426中实现.

您的代码仍将在弃用后编译,具有相同的含义.改变将是没有人(至少没有人熟悉语言规范/实现)应该期望它被解释为赋值.

  • 所以这意味着它只能用变量`x`工作,不是吗? (4认同)
  • 另外需要注意的是,如果你有,例如`var m = 12; 打印(m = 13); print(m);`,你得到"()13".至于为什么,这里有官方解释和一些其他好的见解:/sf/ask/139910711/ (3认同)