ケースクラス(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 をつけておくものだと覚えておこう。
パターンマッチングはもっと強力なんだけど、今日のところはこのへんで。