Почему этот код Scala с назначением val в параметре работает?

object Main {

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

вывода: Hello World10

Как известно, в Scala значение val не может быть переназначено или изменено, но здесь x меняется на

Привет, мир

при печати.

Ответ 1

Объяснение является неожиданным: print имеет параметр с именем x. Использование x =... использует именованный аргумент, поэтому print(x="Hello World") совпадает с print("Hello World").

См. Документы Scala Predef или Predef.scala:

object Predef /*....*/ {

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

/*....*/
}

Примечание: это уже обсуждалось в списке рассылки Scala Internal:

Scala в настоящее время пытается быть разумным в отношении "x = e" в качестве именованного аргумента или назначения... Это может быть удивительно для пользователя....

Предложение: мы осуждаем присвоения в списках аргументов

Для этого также существует проблема SI-8206, это изменение, вероятно, было реализовано в выпуске 426 для Scala 2.13.

Ваш код будет компилироваться после устаревания с тем же значением. Это изменение будет никем (по крайней мере, никто, достаточно знакомый с языковыми спецификациями/реализацией), должен ожидать, что он будет интерпретироваться как присвоение.