7358


あるコードで

[code]

    var a:Int = _
    
[/code]

という感じのものを見たのですが、どういう意味(定義)なんでしょうか？  
実際には 0 がはいるみたいですが。


CC BY-SA 3.0
2015-03-03T05:31:26.840
7355
2015-03-03T06:40:34.197
2015-03-03T06:27:07.777
3466
3466
question
scala
アンダースコアを代入する( var a:Int = _ )の意味(定義)は？


初期値(デフォルト値)が入ります。Intなら0ですがStringならnull, Booleanならfalseです。

[code]

    var a:Int = _
    a: Int = 0
    
    var a:String = _
    a: String = null
    
    var a:Boolean = _
    a: Boolean = false
    
[/code]


CC BY-SA 3.0
2015-03-03T05:37:09.753
7356
2015-03-03T05:58:48.607
2015-03-03T05:58:48.607
56
8335
7355
answer


`_` によって初期値を表し、その変数が未定義であることを防ぐことができます。

[参考](http://www.atmarkit.co.jp/ait/articles/1203/02/news118.html)


CC BY-SA 3.0
2015-03-03T05:40:07.023
7357
2015-03-03T06:10:50.650
2015-03-03T06:10:50.650
7926
7926
7355
answer


[言語仕様のVariable Declarations and Definitions](http://www.scala-
lang.org/files/archive/spec/2.11/04-basic-declarations-and-
definitions.html#variable-declarations-and-definitions "Variable Declarations
and Definitions")によれば、型によって

  * Int -- 0
  * Long -- 0L
  * Float -- 0.0f
  * Double -- 0.0d
  * Boolean -- false
  * Unit -- ()
  * 他の型 -- null

がそれぞれ代入されます。

動作は 0 などを代入した場合と同じです。

次のコードをコンパイルして

[code]

    class A1 {
      var i: Int = _
      var l: Long = _
      var f: Float = _
      var d: Double = _
      var b: Boolean = _
      var u: Unit = _
      var o: AnyRef = _
    }
    
    class A2 {
      var i: Int = 0
      var l: Long = 0L
      var f: Float = 0.0f
      var d: Double = 0.0d
      var b: Boolean = false
      var u: Unit = ()
      var o: AnyRef = null
    }
    
[/code]

javap -c でコンストラクタみてみると A1 は

[code]

    public A1();
      Code:
         0: aload_0
         1: invokespecial #63                 // Method java/lang/Object."<init>":()V
         4: return
    
[/code]

と代入が行われていないのに対し、A2 は

[code]

    public A2();
      Code:
         0: aload_0
         1: invokespecial #63                 // Method java/lang/Object."<init>":()V
         4: aload_0
         5: iconst_0
         6: putfield      #25                 // Field i:I
         9: aload_0
        10: lconst_0
        11: putfield      #33                 // Field l:J
        // 以下代入が続く
    
[/code]

というように代入が行われます。

バイトコード上は代入が行われず、[Java言語仕様の初期値](https://docs.oracle.com/javase/specs/jls/se5.0/html/typesValues.html#4.12.5
"Initial Values of Variables") がそのまま利用されるようです。


CC BY-SA 3.0
2015-03-03T05:42:00.730
7358
2015-03-03T06:40:34.197
2015-03-03T06:40:34.197
455
455
7355
answer