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

87

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

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

а также

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}
Рамеш
источник
возможный дубликат In Scala; я должен использовать черту App?
мммммм
1
В случае заданий Apache Spark в документации говорится, что «приложения должны определять метод main () вместо расширения scala.App. Подклассы scala.App могут работать некорректно».
leo9r

Ответы:

64

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

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

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

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

Эмиль Х
источник
Правильно ли я понимаю, что без преимущества признака App этот объект (Application) не действует как любой другой объект scala - в том смысле, что точкой входа является mainметод, а тело выполняется не так, как ожидалось. Выполняется ли он вообще в какой-то момент после входа в main?
Ричард Ситце
@RichardSitze В трейте есть mainметод App, который примешивает к вашему Applicationобъекту. Нет никакой магии, кроме того факта, что отложенная инициализация - это то, что выполняет тело вашего Applicationобъекта.
Emil H
4

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

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

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

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

Taewon
источник
0

Характеристика приложения реализуется с помощью функциональности [[DelayedInit]], что означает, что поля объекта не будут инициализированы до выполнения основного метода.

а-херч
источник