3

私は、scala オブジェクトをシングルトン Java オブジェクトの単純な省略形と考えてきました。つまり、シングルトンのインスタンス化が保証されたオブジェクトのように動作することを期待しています。それから、私は理解できない次のようなことに出くわします:

object Test  extends App{
 var x ="a"

 override def main(args:Array[String]):Unit = {
   println(x )
 }
}

「a」ではなくnullを出力します。

生成されたクラスを見ると、オブジェクト定義である Test$.class が得られます。ただし、インスタンス値「a」は、生成されたdelayedInitを使用して、コンパニオンTestクラスで定義されています。これがどのようにインスタンス化されるかについて誰かが光を当てることができますか? これについて私が持っていたメンタルモデルは明らかに間違っています。

4

1 に答える 1

4

Appまず、その仕組みと仕組みを見てみましょう。Appのドキュメントには、次の注意事項が記載されています。

このトレイトはDelayedInit機能を使用して実装されることに注意してください。 つまり、オブジェクトのフィールドは main メソッドが実行される前に初期化されません。

また、通常、メイン メソッドをオーバーライドする必要がないことにも注意してください。目的は、クラス本体全体を「メイン メソッド」に変えることです。自分が何をしているのかわかっている場合にのみ、オーバーライドすることを選択してください。

あなたの例

わかりました。これら 2 つの事実がわかったので、コードを修正しましょう。考えられる解決策は 2 つあります。

何をしているのかわかっている場合にのみ、メイン メソッドをオーバーライドしましょう。

object Test extends App{
 var x ="a"
 println(x )
}

または、メソッドを定義することを選択できますmainが、extend は選択できませんApp:

object Test {
 var x ="a"

 def main(args:Array[String]):Unit = {
   println(x )
 }
}

結論

オブジェクトの理解は正しいです。紛らわしいのは、実装するDelayedInitですApp。ハッピーコーディング;)

于 2013-11-13T00:53:22.160 に答える