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.
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.
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.
Das App-Merkmal wird mithilfe der Funktion [[DelayedInit]] implementiert. Dies bedeutet, dass Felder des Objekts vor der Ausführung der Hauptmethode nicht initialisiert wurden.
Antworten:
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 )
quelle
main
ist Methode und der Körper nicht wie erwartet ausgeführt. Wird es irgendwann nach dem Eintritt in main überhaupt ausgeführt?main
Methode in derApp
Eigenschaft, die in IhrApplication
Objekt eingemischt wird. Es gibt keine Magie, die über die Tatsache hinausgeht, dass die verzögerte Initialisierung den Körper IhresApplication
Objekts ausführt .Diese beiden Fälle sind in der Scala-Skripterstellung nicht identisch.
object extends App
wurde 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.
quelle
Das App-Merkmal wird mithilfe der Funktion [[DelayedInit]] implementiert. Dies bedeutet, dass Felder des Objekts vor der Ausführung der Hauptmethode nicht initialisiert wurden.
quelle