En el caso de los trabajos de Apache Spark, la documentación indica "que las aplicaciones deben definir un método main () en lugar de extender scala.App. Es posible que las subclases de scala.App no funcionen correctamente".
leo9r
Respuestas:
64
El rasgo de la aplicación es una forma conveniente de crear un programa scala ejecutable. La diferencia con el método alternativo principal es (aparte de las diferencias sintácticas obvias) que el rasgo de la aplicación utiliza la función de inicialización retrasada.
Los objetos que heredan el rasgo de la aplicación, en su lugar, utilizan la función de inicialización retrasada de Scala 2.9 para ejecutar todo el cuerpo como parte de un método principal heredado.
Otra característica nueva del esquema de la aplicación es que ahora se puede acceder a los argumentos de la línea de comandos a través del valor args (que se hereda de la aplicación trait)
¿Tengo razón en mi entendimiento de que sin el beneficio del rasgo de la aplicación, este objeto (Aplicación) no actúa como cualquier otro objeto de Scala, ya que el punto de entrada es el mainmétodo y el cuerpo no se ejecuta como se esperaba? ¿Se ejecuta en algún momento después de la entrada a main?
Richard Sitze
@RichardSitze Hay un mainmétodo en el Apprasgo que se mezcla con su Applicationobjeto. No hay magia más allá del hecho de que la inicialización retrasada es lo que ejecuta el cuerpo de su Applicationobjeto.
Emil H
4
Estos dos casos no son iguales en las secuencias de comandos de Scala.
object extends Appno fue ejecutado por " scala MyObject.scala" comando, pero el objeto que contiene el método principal fue ejecutado por " scala MyObject.scala" comando. Que se describió como scala buscando un objeto con el método principal para la creación de scripts.
Cuando utilice REPL o el conjunto de trabajo scala de Eclipse, debe llamar MyObject.main(Array[String]())explícitamente para ambos casos.
Este sencillo consejo será útil para principiantes como yo.
El rasgo de la aplicación se implementa mediante la funcionalidad [[DelayedInit]], lo que significa que los campos del objeto no se habrán inicializado antes de que se haya ejecutado el método principal.
Respuestas:
El rasgo de la aplicación es una forma conveniente de crear un programa scala ejecutable. La diferencia con el método alternativo principal es (aparte de las diferencias sintácticas obvias) que el rasgo de la aplicación utiliza la función de inicialización retrasada.
De las notas de la versión de 2.9 (consulte http://www.scala-lang.org/old/node/9483 )
fuente
main
método y el cuerpo no se ejecuta como se esperaba? ¿Se ejecuta en algún momento después de la entrada a main?main
método en elApp
rasgo que se mezcla con suApplication
objeto. No hay magia más allá del hecho de que la inicialización retrasada es lo que ejecuta el cuerpo de suApplication
objeto.Estos dos casos no son iguales en las secuencias de comandos de Scala.
object extends App
no fue ejecutado por "scala MyObject.scala
" comando, pero el objeto que contiene el método principal fue ejecutado por "scala MyObject.scala
" comando. Que se describió como scala buscando un objeto con el método principal para la creación de scripts.Cuando utilice REPL o el conjunto de trabajo scala de Eclipse, debe llamar
MyObject.main(Array[String]())
explícitamente para ambos casos.Este sencillo consejo será útil para principiantes como yo.
fuente
El rasgo de la aplicación se implementa mediante la funcionalidad [[DelayedInit]], lo que significa que los campos del objeto no se habrán inicializado antes de que se haya ejecutado el método principal.
fuente