Differenza tra l'utilizzo delle caratteristiche dell'app e il metodo principale in scala


87

Qual è la differenza tra

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

e

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


1
Nel caso di lavori Apache Spark, la documentazione afferma "che le applicazioni dovrebbero definire un metodo main () invece di estendere scala.App. Le sottoclassi di scala.App potrebbero non funzionare correttamente."
leo9r

Risposte:


64

Il tratto App è un modo conveniente per creare un programma scala eseguibile. La differenza rispetto al metodo altenativo principale è (a parte le ovvie differenze sintattiche) che il tratto App utilizza la funzione di inizializzazione ritardata.

Dalle note di rilascio per 2.9 (vedere http://www.scala-lang.org/old/node/9483 )

Gli oggetti che ereditano il tratto App fanno invece uso della funzionalità di inizializzazione ritardata di Scala 2.9 per eseguire l'intero corpo come parte di un metodo principale ereditato.

Un'altra nuova funzionalità dello schema App è che gli argomenti della riga di comando sono ora accessibili tramite il valore args (che viene ereditato dall'app trait)


Ho ragione nella mia comprensione che senza il beneficio del tratto App, questo oggetto (Applicazione) non si comporta come nessun altro oggetto scala - in quanto il punto di ingresso è il mainmetodo e il corpo non viene eseguito come previsto. Viene eseguito a un certo punto dopo l'entrata in main?
Richard Sitze

@RichardSitze C'è un mainmetodo nel Apptratto che la strega si unisce al tuo Applicationoggetto. Non c'è magia in corso oltre al fatto che l'inizializzazione ritardata è ciò che esegue il corpo del tuo Applicationoggetto.
Emil H

4

Questi due casi non sono gli stessi nello scripting in scala.

object extends Appnon è stato eseguito dal scala MyObject.scalacomando " ", ma l'oggetto contenente il metodo principale è stato eseguito dal scala MyObject.scalacomando " ". Che è stato descritto come scala alla ricerca di oggetti con il metodo principale per lo scripting.

Quando si utilizza REPL o scala workseet di Eclipse, è necessario chiamare MyObject.main(Array[String]())esplicitamente per entrambi i casi.

Questo semplice suggerimento sarà utile per i principianti come me.


0

La caratteristica dell'app viene implementata utilizzando la funzionalità [[DelayedInit]], il che significa che i campi dell'oggetto non saranno stati inizializzati prima che il metodo principale sia stato eseguito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.