Match式(Switch)

ScalaにはSwitch文はないが、それと似たものにmatch式がある。では、何故Switchでないかというと、match式が他の言語のように単なるIfの代替表現ではなく、それ以上の機能を持っているからである。

まずはSwitch文的な使い方から見てみよう。defaultはないが、ワイルドカード(_)を使って同様の処理を記述できる。つまり、以下ではnが1の場合"nは1です。"と表示し、nがそれ以外ならば"nは1以外です。"と表示する。breakはないが、下のcaseに処理が継続しない。

// switch文的な使い方
val n = 1
n match {
  case 1 => println("nは1です。")
  case _ => println("nは1以外です。")
}
nは1です。

因みに、どのcaseにもマッチしなかった場合、MatchErrorがスローされることになるので、ワイルドカードでmatch式を網羅的にしておいたほうが良いだろう。

また、match式は値を返すので、よりScalaっぽく書くなら以下のようになる。

// よりScalaっぽく
val result = n match {
  case 1 => "1です。"
  case _ => "1以外です。"
}
println("nは" + result)

もっとScalaならでは書き方をしてみよう。Any型のnum変数の型はmatch式で以下のように判定できる。

// 変数の型を判定する
val num: Any = 3L
val t = num match {
  case _: Int => "整数"
  case _: Long => "長整数"
  case _: String  => "文字列"
  case _ => "判定不能"
}
println(f"${num}は${t}です。")
3は長整数です。

caseには、ifを使ったパターンガードを書くこともできる。先ほどのコードに少し手を加えて、numが10未満の整数であった場合にはその旨を表示する。caseで変数を書くと、そのcase節には判定対象(この場合、num変数の値)が変数として渡されるので、これを使って10未満かどうかifで判定する。

// 変数の型を判定する
val num: Any = 3
val t = num match {
  case n: Int if n < 10 => "10未満の整数"
  case _: Int => "整数" // 10以上の整数
  case _: Long => "長整数"
  case _: String  => "文字列"
  case _ => "判定不能"
}
println(f"${num}は${t}です。")
3は10未満の整数です。
(2015/04/02)

新着情報
【オープンソースソフトウェア環境構築】Apple silicon Macで開発環境を構築
【Rust Tips】Actix webでJSONをPOSTする
【Rust Tips】コマンドライン引数を取得する

Copyright© 2004-2018 モバイル開発系(K) All rights reserved.
[Home]