2012-06-22 8 views
8

scala Appの特性を使用すると、printlnが機能しなくなります。予想通りScala printlnがApp Traitで機能しない

この単純な例版画、

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 

しかし、私はそれがない形質を導入した後、

object HelloWorld extends App { 
    println("Hello, world!") 
} 

は、私は、コンソールにエラーがなく、何も印刷何を取得していません。

答えて

10

最初にコンパイルしましたか(scalac HelloWorld.scalaを実行していますか?)このコメントを参照してください:http://www.scala-lang.org/node/9483#comment-40627

詳細を編集するために編集: 最初のバージョンが実際にコンパイルされました。明示的なmainメソッドのないScalaファイルは、スクリプトとしてコンパイルされずに実行されます。つまり、2番目のバージョンでは、ファイル内のコマンドがインタプリタに入力されたかのように順次実行されるため、オブジェクトHelloWorldが作成されますが、メソッドは呼び出されません。ここでは、スクリプト言語としてScalaの詳細情報があります(ステップ5にスクロール):http://www.artima.com/scalazine/articles/steps.html

+0

奇妙な。それは通訳の奇妙な制限のようです。クラスをコンパイルして動作させる必要がある理由は何ですか?形質は通訳では機能しませんか? –

+1

特徴はインタプリタで機能しますが、Appは特殊なケースです。多くの場合、「アプリケーションはメインオブジェクトの実装オブジェクト内にコードをラップします」と表示されますが、それは実際にはそうではありません - むしろ、そのメソッドをdelayInitという名前にします。オブジェクトが作成されます。これは通常、オブジェクト宣言内のベアコードが呼び出されるときです。 –

+0

ああ、意味がある、説明のおかげで。 –

5

をやりたい

object HelloWorld extends App { 
    /* code */ 
} 

HelloWorld.main(args) 
あなたのファイルの最後に

クラスはメソッドを定義しますが、呼び出す必要もあります。

関連する問題