こんにちは!ぐちです。
最近続いています基本構文シリーズですが、(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では_として扱われるところもおもしろいですねよ。
では今回はこの辺で。