路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

メモ: Scalaのお勉強 #3 path-dependent typeとEnumeration

2008-11-05 22:27:55 | プログラミング
よく分からない。

object Direction extends Enumeration {
val North = Value("North")
val East = Value("East")
val South = Value("South")
val West = Value("West")
}

で、Directionというオブジェクトに結びついた型、Direction.Valueができるのは良いと思う。

でも、なぜ、forで回せるのだ。

scala> for (d <- Direction) print(d + " ")
North East South West

試しに、

object D extends Enumeration {
val North = 1
val East = 2
val South = 3
val West = 4
}

とすると、forで回せなくなる点からして、Value()というメソッドがなんかこっそりやってるのだろうなあ。

(2008/11/06 追記)

解決しました。

結論から言うと、メソッドValue -> Valのコンストラクタ -> 変数valuesという風になっていて、後は、for文のところで、for文 -> foreachメソッド -> ・・・ -> 変数values、となってます。

Enumeration.scalaに、

private val values: Map[Int, Value] = new HashMap

という行と(ここで、HashMapはmutableの方です)

protected final def Value: Value =
new Val(nextId, if (nextName.hasNext) nextName.next else null)

という行と

protected class Val(i: Int, name: String) extends Value {
・・・(略)・・・
values(i) = this
・・・(略)・・・
}

というのを見つけました。

後は、

for (d <- Direction) なんたら

がコンパイラによって、

Direction.foreach(d => なんたら)

に直されて、foreachメソッドの定義がどーたらこーたら、となります。

あーしんど。

最新の画像もっと見る