Різниця між використанням ознаки програми та основним методом у масштабі


87

Яка різниця між

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

і

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


1
У випадку із завданнями Apache Spark, в документації зазначено, "що додатки повинні визначати метод main () замість розширення scala.App. Підкласи scala.App можуть працювати некоректно".
leo9r

Відповіді:


64

Особливість програми - це зручний спосіб створення виконуваної програми масштабування. Різниця до альтернативного методу основного методу полягає (окрім очевидних синтаксичних відмінностей) у тому, що ознака програми використовує функцію затримки ініціалізації.

З приміток до випуску для версії 2.9 (див. Http://www.scala-lang.org/old/node/9483 )

Натомість об’єкти, що успадковують ознаку програми, використовують функцію відкладеної ініціалізації Scala 2.9 для виконання всього тіла як частини успадкованого основного методу.

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


Чи правильно я розумію, що без переваг ознаки програми цей об’єкт (Application) не діє як будь-який інший об’єкт масштабування, оскільки точка входу - це mainметод, а тіло не виконується належним чином. Чи виконується воно взагалі в якийсь момент після входу в main?
Richard Sitze

@RichardSitze У mainметоді, який Appвідьма отримує, до вашого Applicationоб’єкта є метод . Ніякої магії не відбувається, окрім того, що відстрочена ініціалізація - це те, що виконує тіло вашого Applicationоб’єкта.
Emil H

4

Ці два випадки не є однаковими для сценаріїв масштабування.

object extends Appне було виконано командою " scala MyObject.scala", але об'єкт, що містить основний метод, був виконаний командою " scala MyObject.scala". Що було описано як масштаб, що шукає об'єкт з основним методом сценаріїв.

При використанні REPL або робочої таблиці Scala Eclipse потрібно MyObject.main(Array[String]())чітко зателефонувати для обох випадків.

Ця проста порада буде корисною для таких початківців, як я.


0

Засіб програми реалізовано за допомогою функціональності [[DelayedInit]], що означає, що поля об'єкта не будуть ініціалізовані до виконання основного методу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.