- Scala には
enumは無い。(予約語としては) - Enumeration が準備されているが使い勝手が悪い。(多分一般には使われていない)
- その代わりに Scala では
case classとcase objectを使う。 -
CやC#の様に=で判別するのではなく、パターンマッチを使いmatchで分岐する。
case object を使う
- 基底(
enumの型)になるクラスをsealed abstract classで作る。 -
enumのメンバーとして、それを継承するfinal case objectを作る。
sealed abstract class Color
final case object Black extends Color
final case object White extends Color
- 利用時には
matchを使う。
color match {
case Black => ...
case White => ...
}
case class を使う
-
case objectの他にも、case classを使うことも出来る。 -
case classはcase objectと違い、パターンマッチに使える値を持つことが出来る。
sealed abstract class Color
final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color
color match {
case Rgb(r, g, b) => ...
case Hsl(h, s, l) => ...
}
case object と case class を混ぜる
-
enumのメンバーは、case objectとcase classを混ぜることができる。 -
enumの中に更にパラメータがある場合はcase class、無い場合はcase objectを使う。
sealed abstract class Color
final case object Black extends Color
final case object White extends Color
final case class Rgb(r: Int, g: Int, b: Int) extends Color
final case class Hsl(h: Int, s: Int, l: Int) extends Color
color match {
case Black => ...
case White => ...
case Rgb(r, g, b) => ...
case Hsl(h, s, l) => ...
}