Pourquoi ce code Scala avec affectation d’une valeur dans un paramètre fonctionne-t-il?

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

sortie: Bonjour World10

Comme nous le soaps, dans Scala, un val ne peut être ni réaffecté ni modifié, mais ici,

Bonjour le monde

lors de l’impression.

L’explication est plutôt inattendue: print a un paramètre nommé x . Utiliser x = ... utilise l’ argument nommé , par conséquent, print(x="Hello World") est identique à print("Hello World") .

Voir Scala Predef docs ou source Predef.scala :

 object Predef /*....*/ { /*....*/ def print(x: Any) = Console.print(x) /*....*/ } 

Note: ceci a déjà été discuté dans la liste de diffusion Scala Internal :

Scala essaie actuellement d’être intelligent en traitant “x = e” comme un argument nommé ou une affectation … Cela peut être surprenant pour l’utilisateur ….

Proposition: nous déconseillons les affectations dans les listes d’arguments

Il existe également un problème SI-8206 pour cela, le changement a probablement été mis en œuvre dans le numéro 426 pour Scala 2.13.

Votre code sera toujours compilé après la dépréciation, avec la même signification. Le changement sera nul (personne du moins ne connaissant suffisamment les spécifications / implémentation du langage) ne devrait s’attendre à ce qu’il soit interprété comme une assignation.