Scala 2 での enum
- Scala 2 には予約語としての
enumはありません - Enumeration が準備されていますが、一般的には利用されていません
- 他の言語での
enumの代用として Scala ではcase classとcase objectを使います
case object を使う
- 基底(enum の型)になるクラスを
sealed traitで作ります。 - enum のメンバーとして、それを継承する
final case objectを作ります。
sealed trait 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 trait 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 trait 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) => ...
}