よく分からない。
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メソッドの定義がどーたらこーたら、となります。
あーしんど。
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メソッドの定義がどーたらこーたら、となります。
あーしんど。