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");
    }
}
Ramesh
fonte
possível duplicata do In Scala; devo usar o atributo App?
mmmmmm
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)

Emil H
fonte
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.

Taewon
fonte
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.

a-herch
fonte