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)
main
metodo e il corpo non viene eseguito come previsto. Viene eseguito a un certo punto dopo l'entrata in main?
main
metodo nel App
tratto che la strega si unisce al tuo Application
oggetto. Non c'è magia in corso oltre al fatto che l'inizializzazione ritardata è ciò che esegue il corpo del tuo Application
oggetto.
Questi due casi non sono gli stessi nello scripting in scala.
object extends App
non è stato eseguito dal scala MyObject.scala
comando " ", ma l'oggetto contenente il metodo principale è stato eseguito dal scala MyObject.scala
comando " ". 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.