Diferença entre o uso de App trait e método principal no scala


87

Qual é a diferença entre

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

e

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


1
No caso de jobs do Apache Spark, a documentação afirma "que os aplicativos devem definir um método main () em vez de estender scala.App. As subclasses de scala.App podem não funcionar corretamente".
leo9r

Respostas:


64

O recurso App é uma maneira conveniente de criar um programa scala executável. A diferença para o método alternativo principal é (além das diferenças sintáticas óbvias) que o atributo App usa o recurso de inicialização atrasada.

Das notas de lançamento do 2.9 (consulte http://www.scala-lang.org/old/node/9483 )

Os objetos que herdam a característica App, em vez disso, usam o recurso de inicialização retardada do Scala 2.9 para executar o corpo inteiro como parte de um método principal herdado.

Outro novo recurso do esquema do aplicativo é que os argumentos da linha de comando agora são acessíveis por meio do valor args (que é herdado do recurso App)


Estou correto em meu entendimento de que sem o benefício do atributo App, este objeto (Application) não age como qualquer outro objeto scala - no sentido de que o ponto de entrada é o mainmétodo e o corpo não é executado conforme o esperado. É executado em algum ponto após a entrada no principal?
Richard Sitze

@RichardSitze Existe um mainmétodo no Apptrait que é misturado ao seu Applicationobjeto. Não há mágica acontecendo além do fato de que a inicialização atrasada é o que executa o corpo do seu Applicationobjeto.
Emil H

4

Esses dois casos não são iguais no script do scala.

object extends Appnão foi executado pelo scala MyObject.scalacomando " ", mas o objeto que contém o método principal foi executado pelo scala MyObject.scalacomando " ". Que foi descrito como scala procurando por objeto com método principal de script.

Ao usar REPL ou scala workseet do Eclipse, é necessário chamar MyObject.main(Array[String]())explicitamente para ambos os casos.

Esta dica simples será útil para iniciantes como eu.


0

A característica do aplicativo é implementada usando a funcionalidade [[DelayedInit]], o que significa que os campos do objeto não serão inicializados antes da execução do método principal.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.