bussorenre Laboratory

hoge piyo foo bar

Scala におけるパターンマッチ

今日もScala。明日もScala。明後日も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

アットマークで、マッチしたパターン全体に対する変数束縛することが出来る。このケースの場合は、その他をしめすパターン _ を変数束縛させることが可能になっている。