ケースクラス(case class)は、Scala の強力なパターンマッチングのために必要なものらしい。普通のクラス(class)とどう違うのかよくわからないけど、パターンマッチングに使いたければケースクラスにしておけ、くらいに覚えておく(とりあえず)。
ケースクラスは次のように case キーワードをつけて宣言する。
scala> sealed abstract class DayOfWeek defined class DayOfWeek scala> case object Sunday extends DayOfWeek defined object Sunday scala> case object Monday extends DayOfWeek defined object Monday scala> case object Tuesday extends DayOfWeek defined object Tuesday scala> case object Wednesday extends DayOfWeek defined object Wednesday scala> case object Thursday extends DayOfWeek defined object Thursday scala> case object Friday extends DayOfWeek defined object Friday scala> case object Saturday extends DayOfWeek defined object Saturday
クラスだと言っておきながらオブジェクト(object)なんだけど、どっちでもいいってことなんだろうか。ともかくこれらは次のようにパターンマッチングに使える。
scala> val x: DayOfWeek = Tuesday x: DayOfWeek = Tuesday scala> x match { | case Sunday => 0 | case Monday => 1 | case Tuesday => 2 | case Wednesday => 3 | case Thursday => 4 | case Friday => 5 | } <console>:19: warning: match may not be exhaustive. It would fail on the following inputs: Saturday x match { ^ res1: Int = 2
曜日を表すオブジェクトに対応する整数を返すコードだけど、今日(x)は火曜日なので 2 が返ってきている。
警告が出ているのは、マッチの分岐が完全じゃないかもしれないってこと。実際 Saturday が抜けている。これは、スーパークラス/トレイトの宣言に sealed 修飾子をつけるとその(直接の)サブクラス/トレイト(オブジェクトも?)は同じファイル内にしか宣言できない、という性質を利用して実現されている。
sealed 修飾子はこの用途以外ではめったに使われないので、ケースクラスのスーパークラス/トレイトには sealed をつけておくものだと覚えておこう。
パターンマッチングはもっと強力なんだけど、今日のところはこのへんで。