Quelle est la différence entre
object Application extends App {
println("Hello World")
}
et
object Application {
def main(args: Array[String]): Unit = {
println("Hello World");
}
}
Quelle est la différence entre
object Application extends App {
println("Hello World")
}
et
object Application {
def main(args: Array[String]): Unit = {
println("Hello World");
}
}
Réponses:
Le trait App est un moyen pratique de créer un programme exécutable scala. La différence avec l'alternative de la méthode principale est (à part les différences syntaxiques évidentes) que le trait App utilise la fonction d'initialisation retardée.
À partir des notes de version de la version 2.9 (voir http://www.scala-lang.org/old/node/9483 )
Les objets héritant du trait App utilisent à la place la fonction d'initialisation retardée de Scala 2.9 pour exécuter tout le corps dans le cadre d'une méthode principale héritée.
Une autre nouvelle fonctionnalité du schéma App est que les arguments de ligne de commande sont désormais accessibles via la valeur args (qui est héritée du trait App)
main
méthode et le corps n'est pas exécuté comme prévu. Est-il exécuté du tout à un moment donné après l'entrée dans main?
main
méthode dans le App
trait qui est mélangée à votre Application
objet. Il n'y a pas de magie au-delà du fait que l'initialisation retardée est ce qui exécute le corps de votre Application
objet.
Ces deux cas ne sont pas les mêmes sur le script scala.
object extends App
n'a pas été exécuté par la scala MyObject.scala
commande " ", mais l'objet contenant la méthode principale a été exécuté par la scala MyObject.scala
commande " ". Ce qui a été décrit comme scala recherchant un objet avec la méthode principale de script.
Lorsque vous utilisez REPL ou scala workseet d'Eclipse, vous devez appeler MyObject.main(Array[String]())
explicitement dans les deux cas.
Cette astuce simple sera utile pour les débutants comme moi.