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)
Copyright© 2004-2018 モバイル開発系(K) All rights reserved.
[Home]
|