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");
}
}
Le trait App est un moyen pratique de créer un programme scala exécutable. La différence par rapport à l'altenative de méthode principale est (hormis les différences syntaxiques évidentes) que le trait App utilise la fonctionnalité d'initalisation retardée.
D'après les notes de publication 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 fonctionnalité d’initialisation différée de Scala 2.9 pour exécuter le corps entier dans le cadre d’une méthode principale héritée.
Une autre nouveauté du schéma d'application est que les arguments de ligne de commande sont désormais accessibles via la valeur args (héritée de trait App).
Ces deux cas ne sont pas les mêmes sur le script scala.
object extends App
n'a pas été exécuté par la commande "scala MyObject.scala
", .__, mais l'objet contenant la méthode main a été exécuté par la commande "scala MyObject.scala
" .
Lorsque vous utilisez REPL ou le scala workseet d’Eclipse, Doit appeler explicitement MyObject.main(Array[String]())
pour les deux cas.
Cette astuce simple soit utile pour un débutant comme moi.
Le trait d'application est mis en œuvre à l'aide de la fonctionnalité [[DelayedInit]], ce qui signifie que les champs de l'objet n'auront pas été initialisés avant l'exécution de la méthode principale.