Qual è la differenza tra
object Application extends App {
println("Hello World")
}
e
object Application {
def main(args: Array[String]): Unit = {
println("Hello World");
}
}
Qual è la differenza tra
object Application extends App {
println("Hello World")
}
e
object Application {
def main(args: Array[String]): Unit = {
println("Hello World");
}
}
Risposte:
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)
mainmetodo e il corpo non viene eseguito come previsto. Viene eseguito a un certo punto dopo l'entrata in main?
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.
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.