software - ¿Por qué este código Scala con asignación de un valor en un parámetro funciona?
scala tutorial (1)
object Main {
def main(args: Array[String])
{
val x = 10
print(x="Hello World")
print(x)
}
}
salida: Hello World10
Como sabemos, en Scala un val
no puede ser reasignado o cambiado, pero aquí x
está cambiando a
Hola Mundo
mientras se imprime.
La explicación es algo inesperada: la print
tiene un parámetro llamado x
. Usar x = ...
usa el argumento nombrado , por lo tanto, print(x="Hello World")
es lo mismo que print("Hello World")
.
Ver Scala Predef docs o Predef.scala fuente:
object Predef /*....*/ {
/*....*/
def print(x: Any) = Console.print(x)
/*....*/
}
Nota: esto ya se discutió en la lista de correo interna de Scala :
Scala actualmente intenta ser inteligente al tratar a "x = e" como un argumento con nombre o una asignación ... Esto puede sorprender al usuario ...
Propuesta: desaprobamos las asignaciones en listas de argumentos.
También existe un problema SI-8206 para esto, el cambio probablemente se implementó en el problema 426 para Scala 2.13.
Su código todavía se compilará después de la desaprobación, con el mismo significado. El cambio será que nadie (al menos nadie suficientemente familiarizado con las especificaciones / implementación del idioma) debe esperar que se interprete como una asignación.