Różnica między używaniem cechy aplikacji a główną metodą w scali

87

Jaka jest różnica pomiędzy

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

i

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}
Ramesh
źródło
1
W przypadku zadań Apache Spark dokumentacja stwierdza, że ​​„aplikacje powinny zdefiniować metodę main () zamiast rozszerzania scala.App. Podklasy scala.App mogą nie działać poprawnie”.
leo9r

Odpowiedzi:

64

Cecha aplikacji to wygodny sposób tworzenia wykonywalnego programu w formacie Scala. Różnica w stosunku do głównej metody alternatywnej polega na tym (poza oczywistymi różnicami składniowymi), że cecha aplikacji korzysta z funkcji opóźnionej inicjalizacji.

Z informacji o wydaniu 2.9 (zobacz http://www.scala-lang.org/old/node/9483 )

Obiekty dziedziczące cechę App zamiast tego wykorzystują funkcję opóźnionej inicjalizacji Scala 2.9, aby wykonać całe ciało jako część dziedziczonej metody głównej.

Kolejną nową funkcją schematu aplikacji jest to, że argumenty wiersza poleceń są teraz dostępne za pośrednictwem wartości args (która jest dziedziczona z cechy App)

Emil H.
źródło
Czy mam rację, rozumiejąc, że bez korzyści z cechy App ten obiekt (Application) nie działa jak każdy inny obiekt scala - w tym sensie, że punktem wejścia jest mainmetoda, a treść nie jest wykonywana zgodnie z oczekiwaniami. Czy jest w ogóle wykonywany w pewnym momencie po wejściu do main?
Richard Sitze
@RichardSitze Cecha, która jest mieszana z twoim obiektem, zawiera mainmetodę . Nie ma żadnej magii poza faktem, że opóźniona inicjalizacja jest tym, co wykonuje ciało twojego obiektu. AppApplicationApplication
Emil H
4

Te dwa przypadki nie są takie same w skryptach Scala.

object extends Appnie został wykonany scala MyObject.scalapoleceniem " ", ale obiekt zawierający metodę główną został wykonany scala MyObject.scalapoleceniem " ". Który został opisany jako scala szukający obiektu z główną metodą do skryptowania.

Podczas korzystania z REPL lub zestawu zadań Scala Eclipse należy wywołać MyObject.main(Array[String]())jawnie w obu przypadkach.

Ta prosta wskazówka może być pomocna dla początkujących, takich jak ja.

Taewon
źródło
0

Cecha aplikacji jest implementowana przy użyciu funkcjonalności [[DelayedInit]], co oznacza, że ​​pola obiektu nie zostaną zainicjowane przed wykonaniem metody głównej.

a-herch
źródło