|
|||||
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]
|
|||||