Différence entre l’utilisation du trait App et la méthode principale dans Scala

Quelle est la différence entre

object Application extends App { println("Hello World") } 

et

 object Application { def main(args: Array[Ssortingng]): Unit = { println("Hello World"); } } 

Le trait App est un moyen pratique de créer un programme scala exécutable. La différence avec l’altérative de la méthode principale est (hormis les différences syntaxiques évidentes) que le trait App utilise la fonctionnalité d’initialisation retardée.

A partir des notes de version pour 2.9 (voir http://www.scala-lang.org/old/node/9483 )

Les objects héritant du trait App utilisent plutôt la fonctionnalité d’initialisation retardée de Scala 2.9 pour exécuter le corps entier dans le cadre d’une méthode principale héritée.

Une autre nouvelle fonctionnalité 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 scala MyObject.scala object extends App n’a pas été exécutée par la commande ” scala MyObject.scala “, mais l’object contenant la méthode principale a été exécuté par la commande ” scala MyObject.scala “. Qui a été décrit comme scala à la recherche d’un object avec la méthode principale pour les scripts.

Lorsque vous utilisez une classe de travail REPL ou Scala d’Eclipse, vous devez appeler MyObject.main(Array[Ssortingng]()) explicitement pour les deux cas.

Cette astuce simple est utile pour les débutants comme moi.

App trait est implémenté en utilisant la fonctionnalité [[DelayedInit]], ce qui signifie que les champs de l’object n’auront pas été initialisés avant l’exécution de la méthode principale.