Diferencia entre usar el rasgo de la aplicación y el método principal en Scala


87

Cuál es la diferencia entre

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

y

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


1
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.

De las notas de la versión de 2.9 (consulte http://www.scala-lang.org/old/node/9483 )

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.


0

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.