LoginSignup
2
3

More than 5 years have passed since last update.

Scala で enum っぽいことを実現する

Last updated at Posted at 2016-09-30
  • Scala には enum は無い。(予約語としては)
  • Enumeration が準備されているが使い勝手が悪い。(多分一般には使われていない)
  • その代わりに Scala では case classcase object を使う。
  • CC# の様に = で判別するのではなく、パターンマッチを使い 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 classcase 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 objectcase class を混ぜる

  • enum のメンバーは、case objectcase 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) => ...
}

参考資料

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3