定数パターン
expr match { case 1 => println("one") case _ => println("other") }
変数パターン
expr match { case a => println(s"expr is $a") case _ => println("none") }
型付きパターン
expr match { case a: MyClass => println("hit!") case _ => println("miss...") }
型パラメータは消されるので、下記のようなことはできない。
expr match { case a: MyValue[Int] => println(s"my value is ${a.read}") case b: MyValue[String] => println(s"my value is '${a.read}'") _ => println("none") }
コンストラクタパターン
expr match { case MyCaseAdd(l, r) => println(s"$l + $r = ${l + r}") case _ => println("none") }
MyCaseAdd
はケースクラスである必要がある。
シールドクラス
基底クラスにシールドクラスを利用することで、全ケース網羅のチェックができる。
sealed abstract class Expr case object Even extends Expr case object Odd extends Expr expr match { case Even => println("even") } // ==> warning: match is not exhaustive! // missing combination Odd
シーケンス、タプルパターン
expr match { case List(a, b, _*) => println(s"$a, $b, and more...") case (a, b) => println(s"$a, $b") case _ => println("none") }
_*
で可変長シーケンスとのマッチが可能。
パターン束縛
expr match { case p @ MyPoint(x, y) => println(s"${p.invert}") }
抽出子を使ったパターンマッチ
パターンガード
if
でパターンマッチにさらに条件をつけられる。
expr match { case n if n % 2 == 0 => println(s"even: $n") case n => print(s"odd: $n") }
ケースの変数展開
val (a, b) = expr
部分関数としてのケース
def twice(val: Option[Int]): Int = { case Some(n) => n * 2 case _ => 0 }