こんにちは!ぐちです。
最近続いています基本構文シリーズですが、(1記事ずつが短いのは内緒。笑)今回はmatch式
についてご紹介したいと思います。Javaでいうところのswitch文
とのことです。
前回のVol.14はこちらからどうぞ。
switch – match
一つの値を元に多重分岐を作ることができるJavaのswitch文
ですが、Scalaではmatch式
という構文を使うようです。
これまでとは違い、構文名も違いますが、コードをじっくり見れば大した違いも感じられず、理解しやすいのかなと思いました。
Java
まずはJavaですね。実行時パラメータで受け取った値によって、表示結果を変更する処理です。switch文
の条件に文字列を指定できるようになったのは、確かJava7からの仕様だったと思います。
public class Main { public static void main(String[] args) { String param = args.length > 0 ? args[0] : ""; switch (param) { case "salt": System.out.println("pepper"); break; case "chips": System.out.println("salsa"); break; case "eggs": System.out.println("bacon"); break; default: System.out.println("huh?"); break; } } }
いつも思いますが、break
の冗長さといったら、たまらないですね。笑
Scala
続きまして、Scalaです。
object Main { def main(args: Array[String]): Unit = { val param = if(args.length > 0) args(0) else "" param match { case "salt" => println("pepper") case "chips" => println("salsa") case "eggs" => println("bacon") case _ => println("huh?") } } }
Javaと似ているようで、冗長的な部分だったりがなくなっていますね!さすがです。笑
随分とすっきり見えていますし、可読性も高いですよね。特にJavaとの大きな違いは文ではなく式というところですので、これらを副作用のない書き方に変更することができます。if式
のときと考え方は同じですね。
object Main { def main(args: Array[String]): Unit = { val param = if(args.length > 0) args(0) else "" val friend = param match { case "salt" => "pepper" case "chips" => "salsa" case "eggs" => "bacon" case _ => "huh?" } println(friend) } }
もちろんJavaでも同じような書き方(出力をまとめるという意味)もできますが、副作用のある処理になるのは避けられないので、可読性と処理効率の観点から工夫するということになりますね。
その他違い
Javaのswitch文
とScalaのmatch式
との大きな違いのうちのひとつとして、break
を明示的に書く必要があるか、暗黙的に付与されているかの差です。Javaではbreak
を明示的に書かないと次のcase文
の処理が行われてしまいます。Scalaではbreak
を書かなくても暗黙的に一つのcase
に付与されるので、コードが冗長的にならずに済みます。
また、大きな違いといえば、Javaのdefault
がScalaでは_
として扱われるところもおもしろいですねよ。
では今回はこの辺で。