为什么在参数中分配val的Scala代码可以工作?

为什么在参数中分配val的Scala代码可以工作?,scala,Scala,输出:Hello World10 正如我们所知,在Scala中,aval不能重新分配或更改,但这里的x正在更改为 你好,世界 打印时。解释有些意外:print有一个名为x的参数。使用x=…使用,因此print(x=“Hello World”)与print(“Hello World”)相同 见或资料来源: 注:这已在以下章节中讨论: Scala目前试图巧妙地将“x=e”视为命名参数或赋值 ... 这可能会让用户感到惊讶 建议:我们反对参数列表中的赋值 同样,对于Scala 2.13,可能在中实现了

输出:Hello World10

正如我们所知,在Scala中,a
val
不能重新分配或更改,但这里的
x
正在更改为

你好,世界


打印时。

解释有些意外:
print
有一个名为
x
的参数。使用
x=…
使用,因此
print(x=“Hello World”)
print(“Hello World”)
相同

见或资料来源:

注:这已在以下章节中讨论:

Scala目前试图巧妙地将“x=e”视为命名参数或赋值 ... 这可能会让用户感到惊讶

建议:我们反对参数列表中的赋值

同样,对于Scala 2.13,可能在中实现了更改


您的代码在被弃用后仍将编译,其含义相同。任何人(至少没有足够熟悉语言规范/实现的人)都不应再将更改解释为赋值。

它不是重新赋值。它只是从第一个语句中打印“Hello World”,从第二个语句中打印10。使用println(),您将在新行中看到输出。这意味着这只适用于变量
x
,不是吗?是的,很神奇,它只适用于x!。这很奇怪。另一件需要注意的事情是,如果你有,例如,
var m=12;印刷品(m=13);印刷品(m),你会得到“()13”。至于原因,这里有一个官方解释和其他一些很好的见解:
object Main {

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

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

/*....*/
}