Unterschied zwischen der Verwendung des App-Merkmals und der Hauptmethode in Scala

86

Was ist der Unterschied zwischen

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

und

object Application {
    def main(args: Array[String]): Unit = {
        println("Hello World");
    }
}
Ramesh
quelle
mögliches Duplikat von In Scala; soll ich das App-Merkmal verwenden?
mmmmmm
1
Im Fall von Apache Spark-Jobs heißt es in der Dokumentation, "dass Anwendungen eine main () -Methode definieren sollten, anstatt scala.App zu erweitern. Unterklassen von scala.App funktionieren möglicherweise nicht richtig."
Leo9r

Antworten:

64

Das App-Merkmal ist eine bequeme Möglichkeit, ein ausführbares Scala-Programm zu erstellen. Der Unterschied zur Hauptmethode alternativ besteht (abgesehen von den offensichtlichen syntaktischen Unterschieden) darin, dass das App-Merkmal die Funktion zur verzögerten Initialisierung verwendet.

Aus den Versionshinweisen für 2.9 (siehe http://www.scala-lang.org/old/node/9483 )

Objekte, die das App-Merkmal erben, verwenden stattdessen die verzögerte Initialisierungsfunktion von Scala 2.9, um den gesamten Körper als Teil einer geerbten Hauptmethode auszuführen.

Eine weitere Neuerung des App-Schemas ist, dass Befehlszeilenargumente jetzt über den args-Wert (der von der Trait-App geerbt wird) zugänglich sind.

Emil H.
quelle
Bin ich in meinem Verständnis richtig , dass ohne den Vorteil der App Eigenschaft, diese (Anwendung) Objekt nicht handeln wie alle anderen scala Objekt - dass der Einstiegspunkt ist das mainist Methode und der Körper nicht wie erwartet ausgeführt. Wird es irgendwann nach dem Eintritt in main überhaupt ausgeführt?
Richard Sitze
@RichardSitze Es gibt eine mainMethode in der AppEigenschaft, die in Ihr ApplicationObjekt eingemischt wird. Es gibt keine Magie, die über die Tatsache hinausgeht, dass die verzögerte Initialisierung den Körper Ihres ApplicationObjekts ausführt .
Emil H
4

Diese beiden Fälle sind in der Scala-Skripterstellung nicht identisch.

object extends Appwurde nicht mit dem Befehl " scala MyObject.scala" ausgeführt, aber das Objekt, das die Hauptmethode enthält , wurde mit dem Befehl " scala MyObject.scala" ausgeführt. Was als Scala auf der Suche nach einem Objekt mit der Hauptmethode für die Skripterstellung beschrieben wurde.

Wenn Sie REPL oder Scala Workseet von Eclipse verwenden, müssen Sie in MyObject.main(Array[String]())beiden Fällen explizit aufrufen .

Dieser einfache Tipp ist hilfreich für Anfänger wie mich.

Taewon
quelle
0

Das App-Merkmal wird mithilfe der Funktion [[DelayedInit]] implementiert. Dies bedeutet, dass Felder des Objekts vor der Ausführung der Hauptmethode nicht initialisiert wurden.

a-herch
quelle