ScalaでのAppトレイトとメインメソッドの使用の違い


87

違いは何ですか

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

そして

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


1
Apache Sparkジョブの場合、ドキュメントには「アプリケーションはscala.Appを拡張する代わりにmain()メソッドを定義する必要がある。scala.Appのサブクラスは正しく機能しない可能性がある」と記載されています。
leo9r 2018年

回答:


64

Appトレイトは、実行可能なscalaプログラムを作成するための便利な方法です。メインメソッドの代替との違いは、(明らかな構文上の違いは別として)アプリの特性が遅延初期化機能を使用することです。

2.9のリリースノートから(http://www.scala-lang.org/old/node/9483を参照

アプリの特性を継承するオブジェクトは、代わりにScala 2.9の遅延初期化機能を利用して、継承されたmainメソッドの一部として本体全体を実行します。

Appスキームのもう1つの新機能は、コマンドライン引数にargs値(トレイトAppから継承)を介してアクセスできるようになったことです。


私の理解では、App特性の利点がなければ、この(Application)オブジェクトは他のscalaオブジェクトのようには機能しません。つまり、エントリポイントはmainメソッドであり、本体は期待どおりに実行されません。mainに入った後のある時点で実行されますか?
Richard Sitze 2012

@RichardSitzeトレイトウィッチがオブジェクトにミックスインするmainメソッドがあります。初期化の遅延がオブジェクトの本体を実行するという事実以外に、魔法はありません。AppApplicationApplication
Emil H

4

これらの2つのケースは、scalaスクリプトでは同じではありません。

object extends App" scala MyObject.scala"コマンドでは実行されませんでしたが、mainメソッドを含むオブジェクトは " scala MyObject.scala"コマンドで実行されました。これは、スクリプトのmainメソッドを使用してオブジェクトを探すscalaとして説明されていました。

EclipseのREPLまたはscalaworkseetを使用するMyObject.main(Array[String]())場合は、両方の場合に明示的に呼び出す必要があります。

この簡単なヒントは、私のような初心者に役立ちます。


0

アプリの特性は、[[DelayedInit]]機能を使用して実装されます。つまり、mainメソッドが実行される前に、オブジェクトのフィールドは初期化されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.