В случае заданий Apache Spark в документации говорится, что «приложения должны определять метод main () вместо расширения scala.App. Подклассы scala.App могут работать некорректно».
leo9r
Ответы:
64
Свойство App - удобный способ создания исполняемой программы Scala. Отличие от альтернативного основного метода в том (помимо очевидных синтаксических различий), что свойство App использует функцию отложенной инициализации.
Объекты, наследующие черту 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]())для обоих случаев необходимо явно вызывать .
Этот простой совет будет полезен новичкам вроде меня.
Характеристика приложения реализуется с помощью функциональности [[DelayedInit]], что означает, что поля объекта не будут инициализированы до выполнения основного метода.
Ответы:
Свойство App - удобный способ создания исполняемой программы Scala. Отличие от альтернативного основного метода в том (помимо очевидных синтаксических различий), что свойство App использует функцию отложенной инициализации.
Из примечаний к выпуску 2.9 (см. Http://www.scala-lang.org/old/node/9483 )
источник
main
метод, а тело выполняется не так, как ожидалось. Выполняется ли он вообще в какой-то момент после входа в main?main
методApp
, который примешивает к вашемуApplication
объекту. Нет никакой магии, кроме того факта, что отложенная инициализация - это то, что выполняет тело вашегоApplication
объекта.Эти два случая не совпадают в сценариях scala.
object extends App
не был выполнен командой "scala MyObject.scala
", но объект, содержащий основной метод, был выполнен командой "scala MyObject.scala
". Это было описано как scala, ищущий объект с основным методом скриптинга.При использовании REPL или scala workseet Eclipse
MyObject.main(Array[String]())
для обоих случаев необходимо явно вызывать .Этот простой совет будет полезен новичкам вроде меня.
источник
Характеристика приложения реализуется с помощью функциональности [[DelayedInit]], что означает, что поля объекта не будут инициализированы до выполнения основного метода.
источник