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.
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.
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.
Respostas:
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 )
fonte
main
método e o corpo não é executado conforme o esperado. É executado em algum ponto após a entrada no principal?main
método noApp
trait que é misturado ao seuApplication
objeto. Não há mágica acontecendo além do fato de que a inicialização atrasada é o que executa o corpo do seuApplication
objeto.Esses dois casos não são iguais no script do scala.
object extends App
não foi executado peloscala MyObject.scala
comando " ", mas o objeto que contém o método principal foi executado peloscala MyObject.scala
comando " ". 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.
fonte
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.
fonte