Scala impression des parenthèses supplémentaires
Question
J'ai écrit mon programme premier échantillon de scala et il ressemble à ceci:
def main(args: Array[String]) {
def f1 = println("aprintln")
println("applying f1")
println((f1 _).apply)
println("done applying f1")
}
La sortie est
applying f1
aprintln
()
done applying f1
Quelqu'un peut-il expliquer pourquoi le supplément () apparaît? Je pensais juste aprintln apparaîtrait.
merci,
Jeff
La solution
Cela corrigera le problème:
def main(args: Array[String]) {
def f1 = println("aprintln")
println("applying f1")
(f1 _).apply
println("done applying f1")
}
Et il en sera de ceci:
def main(args: Array[String]) {
def f1 = "aprintln"
println("applying f1")
println((f1 _).apply)
println("done applying f1")
}
Qu'est-ce qui se passe ici est que vous exécutez la fonction f1
avec l'appel à apply
. La f1
fonction imprime « aprintln », et retourne ()
. Vous passez ensuite la sortie de f1
, qui est ()
, à un autre appel à println
. Voilà pourquoi vous voyez une paire supplémentaire de Parans sur la console.
Les parenthèses vides ont l'unité de type à Scala, ce qui équivaut à annuler en Java.
Autres conseils
Les méthodes qui auraient un type de retour de vide dans Java ont un type de retour d'unité Scala. () Est la façon dont vous écrivez la valeur de l'unité.
Dans votre code, les appels f1 println directement. Ainsi, lorsque vous appelez f1 et passer le résultat à println, vous deux imprimer une chaîne dans le corps de f1 et imprimer le résultat, qui est tostring'ed comme ().