object Main {
def main(args: Array[String])
{
val x = 10
print(x="Hello World")
print(x)
}
}
输出:Hello World10
众所周知,在Scala中,val
无法重新分配或更改,但此处x
正在更改为
Hello World
打印时。
答案 0 :(得分:71)
说明有点出乎意料:print
有一个名为x
的参数。使用x = ...
使用named argument,因此print(x="Hello World")
与print("Hello World")
相同。
请参阅Scala Predef docs或Predef.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中实现。
您的代码在弃用后仍会编译,具有相同的含义。改变将是没有人(至少没有人熟悉语言规范/实现)应该期望它被解释为赋值。