Разница между использованием атрибута приложения и основного метода в scala

В чем разница между

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

и

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

Ответ 1

Характеристика приложения - удобный способ создания исполняемой программы scala. Отличие от основного метода altenative (помимо очевидных синтаксических различий) заключается в том, что свойство приложения использует задержанную функцию инициализации.

Из примечаний к выпуску для 2.9 (см. http://www.scala-lang.org/old/node/9483)

Объекты, наследующие свойство приложения, вместо этого используют функцию scala 2.9s delayed initialization, чтобы выполнить весь объект как часть унаследованного основного метода.

Еще одна новая особенность схемы App заключается в том, что аргументы командной строки теперь доступны через значение args (которое унаследовано от trait App)

Ответ 2

Эти два случая не совпадают с сценариями scala.

object extends App не выполнялся командой "scala MyObject.scala", но объект, содержащий основной метод, был исполнен командой "scala MyObject.scala". Это было описано как scala для поиска объекта с основным методом для сценариев.

При использовании REPL или scala рабочего набора Eclipse, необходимо вызвать MyObject.main(Array[String]()) явно для обоих случаев.

Этот простой совет будет полезен для начинающих, таких как я.