Scala におけるパターンマッチ
// Scala におけるパターンマッチ <セレクター式> match { case 選択肢1 case 選択肢2 ...... }
上から順番に与えられた選択肢を評価し、最初にマッチしたもののみを実行する。break 文などは特に不要。
例1, Option をパターンマッチする
val element = Some(100) // or None element match { case Some(e) => println(s"some: ${e}") case _ => println("none") }
この時、e は変数パターンと呼ばれ、ワイルドカードのように機能し、右側の式で値を参照することが出来る。上の例だと、Some の場合、Some の中身 e を変数束縛してその値を参照することが出来る。
_ は変数名束縛の無いワイルドカードで、全てのパターンにマッチするものの右側の式で参照できない。
それ以外は定数パターンで、特定の値のみを受け取る。
マッチするパターンがなければ MatchError が返される。(コンパイル時にwarning が帰ってくるので、事前に気がつくことは出来る。)
ので、想定していない値が来たときのデフォルをの挙動を case _ => sys.error("想定されていない動作")
等を組んでおくことが無難か
if とかと同様に、match も式 なので、必ず値を返す。
def hoge(n: Int) = n + 100 val element = Some(100) // or None val result = element match { case Some(e) => Some(hoge(e)) case _ => None } println(result) // Some(200) or None
上の例では、element がsome ならその中身に関数hogeを適用して返し、None ならNone を返すというロジックを組んでいる。
以下追記:
case _ => None
のところは以下のようにも書ける
case n @ _ => n
アットマークで、マッチしたパターン全体に対する変数束縛することが出来る。このケースの場合は、その他をしめすパターン _
を変数束縛させることが可能になっている。