- 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) => ...
}