bussorenre Laboratory

hoge piyo foo bar

パターンマッチ

今日もScala。明日もScala。明後日もScala

Programming in Scala 第15章 ケースクラスとパターンマッチ。

// Java における比較対象
switch ( <セレクター式>) {
    case: 選択肢1
    case: 選択肢2
    default: その他
}
// Scala におけるパターンマッチ
<セレクター式> match {
    case 選択肢1
    case 選択肢2
    ......
 }

要するにSwitch 文の事……? 上から順番に与えられた選択肢を評価し、最初にマッチしたもののみを実行する。break 文などは特に不要。

expr match {
    case Hoge(e, 1) => e
    case Piyo(e,2) => e
    case Fuga(_, 3) => Nil

この時、e は変数パターンと呼ばれ、ワイルドカードのように機能し、右側の式で値を参照することが出来る。 _ は変数名束縛の無いワイルドカードで、全てのパターンにマッチするものの右側の式で参照できない。 それ以外は定数パターンで、特定の値のみを受け取る。

Java におけるswitch 文との違いは、

  • Java は 定数パターンしか扱えない
  • Java とか Cみたいにbreakを挟まないと行けないとかがない。先述の通り、最初にマッチしたものだけを実行する
  • マッチするパターンがなければ MatchError が返される。

じゃぁdefault の代わりにどうするのかと言われると、こうする

expr match  {
  case Hoge(1, e) => e
  case _ =>
}

この時、Hoge(1,e) にマッチしなかった場合は全て 次のcase _ にマッチする。何も結果を返さないので、このmatch 式全体の戻り値は(): Unit になる。

if とかと同様に、match も なので、必ず値を返す。