NetBeansとScalaで遊ぶ(パターンマッチ編)

前回の続き。


次のコードをステップ実行

val xy = (1, 2)      // (a)
val (x, y) = xy      // (b)
val abc = (1, 2, 3)  // (c)
val (a, b, c) = abc  // (d)

タプルを使った代入。
(b)を行った時点で、謎の変数temp1が登場。オブジェクトIDはxyと同じ。
(d)の代入を行った時にtemp1は消滅。temp4が登場、temp4のオブジェクトIDはabcと同じ。

ここで実験、temp1が定義済だったらどうなるか。

val temp1 = "my temp1" // (a)
val xy = (1, 2)        // (b)
val (x, y) = xy        // (c)
println(temp1)         // (d)

別な変数名が割り当てられるという予想だった。
しかし、(c)までは変数ウィンドウに"名前=temp1,型=String,値=my temp1"が表示されていたのに(c)の後のtemp1はxyをと同じオブジェクトIDになってしまった…。
(d)の結果はちゃんと"my temp1"と出力されるのだけれど。

タプルの代入はパターンマッチを使っているので、謎の変数の登場にはパターンマッチが絡んでるという前提で、以下のソースで実験。

val xy = (1, 2)
val (x, y) = xy
case class Foo(n:Int, s:String)
val foo = Foo(1, "foo")
foo match {
  case Foo(1, w) => println(w)
  case _ => println("unmatch")
}

タプルからの代入で出来たtemp1がパターンマッチで消えて、temp9が出来ました。

以上、scalaのコーディングの役には立たない情報ですが、遊びなので。