Scalaのmatch式
switchと違いフォールスルーしない。
code:scala
# 基本構文
対象式 match {
case パターン => 式
# 複数パターンを|で列挙する
case パターン1|パターン2 => 式
# パターンにはガード式で条件をつけられる
case パターン if ガード式 => 式
# ワイルドカードパターンがdefaultに相当する
case _ => 式
}
値によるパターン
値パターンに合致したものを変数に入れる
code:scala
scala> var list = List("A", "B", "C")
list: ListString = List(A, B, C) scala> list match {
| case List("A", b, c) => println("b is "+b+", c is "+c)
| case _ => println("nothing")
| }
b is B, c is C
「先頭がAであるようなリスト」というパターンで、残りの要素を変数に束縛している。
変数に入れる部分を指定する
code:scala
scala> list match {
| case List(a@"A", b, c) => println(a)
| case _ => println("no")
|
| }
A
変数名@パターン の形式で変数に束縛するパターンを細かく指定できる。
@を使う表記はasパターンと呼ばれる
中置を使った表現
code:scala
scala> list match {
| case "A" :: b :: c :: _ => println("b is "+b+", c is "+c)
| case _ => println("no")
| }
b is B, c is C
_ には残りの要素が入る。
型によるパターン
変数:型 で値ではなく型によるパターンを表現できる。
要は instanceOf でマッチさせてそのまんま変数に入れられるので便利。
変数が要らなければ _:型 としておく。
code:scala
scala> val obj: AnyRef = "String Literal"
obj: AnyRef = String Literal
scala> obj match {
| case v:java.lang.Integer => println("obj is integer")
| case v:String => println(v.toUpperCase)
| }
STRING LITERAL