tkzwhr's notes

tkzwhrの技術、中国語などのメモです。

Scalaパターンマッチ集

定数パターン

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
}