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

时间:2018-03-13 07:23:40

标签: scala

object Main {

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

输出:Hello World10

众所周知,在Scala中,val无法重新分配或更改,但此处x正在更改为

  

Hello World

打印时。

1 个答案:

答案 0 :(得分:71)

说明有点出乎意料:print有一个名为x的参数。使用x = ...使用named argument,因此print(x="Hello World")print("Hello World")相同。

请参阅Scala Predef docsPredef.scala来源:

object Predef /*....*/ {

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

/*....*/
}

注意:这已在Scala Internal mailing list中讨论过:

  

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

     

提案:我们弃用参数列表中的分配

还有exists an issue SI-8206,对于Scala 2.13,更改可能在issue 426中实现。

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