43 votes

Pourquoi ce code Scala avec l'assignation d'une val dans un paramètre fonctionne-t-il ?

object Main {

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

sortie : Hello World10

Comme nous le savons, en Scala, une val ne peuvent être réaffectés ou modifiés, mais ici x passe à

Bonjour le monde

pendant l'impression.

71voto

Suma Points 11966

L'explication est plutôt inattendue : print a un paramètre nommé x . Utilisation de x = ... utilise le argument nommé donc print(x="Hello World") est la même chose que print("Hello World") .

Voir Docs Scala Predef ou Predef.scala source :

object Predef /*....*/ {

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

/*....*/
}

Remarque : ce point a déjà été abordé dans Liste de diffusion interne de Scala :

Scala essaie actuellement de traiter intelligemment "x = e" comme un argument nommé ou une affectation ... Cela peut être surprenant pour l'utilisateur ....

Proposition : nous déprécions les affectations dans les listes d'arguments

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

Votre code continuera à compiler après la dépréciation, avec la même signification. Le changement sera que personne (du moins personne suffisamment familier avec les spécifications du langage / l'implémentation) ne devrait s'attendre à ce qu'il soit interprété comme une affectation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X