目次
1.パターンマッチとは
scalaではmatch構文というのがある。
一見switch-case文のように見えるが、scalaのmatch構文は値のマッチングのみではなくクラスやコレクションなどもマッチングしてくれる。
構文は以下となる。
[target] match { case ① => [[target]が①にmatchしたときの処理] case ② => [[target]が②にmatchしたときの処理] case _ => [[target]にmatchしなかったときの処理] }
ここで注意していただきたいのはjavaなどを使用してきた場合、breakを使わないとしたのcase文を実行してしまいます。
しかし、scalaのmatch構文のcaseはその文を評価したら抜けますのでご注意ください。
ある意味安全でよいですね。
そして、caseは上からパターンチェックが行われていくので、パターンの順序も気負付けておいて下さい。
では実際に試してみます。
本記事ではsbtのREPLを使用して進めていきます。
scala> val n:Any = 50 n: Any = 50 scala> val result = n match { | case i:String => println("n is " + n.toString); 1 ① | case h:Int if h > 50 => println("n is greater than 50"); 2 ② | case g:Int if g <= 50 => println("n is 50 or less"); 3 ③ | case _ => println("other"); 4 ④ | } n is 50 or less result: Int = 3
① nがString型の場合に式を評価する。
② nがInt型で且つ50より大きい場合に式を評価する。
③ nがInt型で且つ50以下の場合に式を評価する。
④ nがほかのどのパターンにも合致しない場合に式を評価する。
といった具合になります。
ここで②と③はif文が入っておりscalaではパターンマッチの条件に論理式を記述できます。
これを「パターンガード」と呼びます。
以上