libro
www.tuyano.com
初心者のためのPlay Framework入門

30分でわかる(かも知れない)Scala超々入門! (5/8)

作成:2013-01-10 08:20
更新:2013-01-10 08:20

■パターンマッチを行う「match」構文

Javaなど多くの言語では、多数の条件分岐を行うための構文というのが用意されていました。Javaでは「switch-case」という構文がありましたね。これにより、指定した値がいくつかによって異なる処理を行わせることが可能になりました。

Scalaにも、このswitch-caseのような構文はあります。それは「match」というものです。これは、以下のような形で記述します。

・match構文
チェックする値 match {
    case 値1 => 実行する処理
    case 値2 => 実行する処理
    ……必要なだけcaseを用意……
    case _ => その他の場合の処理
}

この構文では、「値 match {……}」というように、最初にチェックする値(変数など)を指定し、その後にmatchをつけます。構文内には「case 値 => 処理」というようにして、値と処理を記述します。これにより、チェックする値がcaseに指定したのと同じ値であれば、その=>以降にある処理を実行するようになります。

これだけなら、別になんの変哲もありません。この構文が強力なのは、それぞれのcaseが非常に柔軟な形で指定を行えるためです。例えば、こんなこともできます。
value match {
    case n:Int => ……整数の時の処理……
    case n:String => ……テキストの時の処理……
    case _ => ……その他の処理……
}
これは、変数valueの値が整数かテキストかそれ以外かで異なる処理を行わせる書き方です。このように、caseの後に型指定した変数を用意することで、その型の値の時の処理を記述できます。また最後に「case _」とありますが、このアンダースコアはワイルドカードの働きをするもので、「すべてのcaseに合致しなかった場合」の処理を用意できます。Javaのswitch-caseにおける「default:」に相当するものといってよいでしょう。

更に、=>の手前にif文を用意することで、特定の条件を指定して分岐させることもできます。これは「パターンガード」と呼ばれるもので、これにより特定の上限に合致する場合のみ、そのcaseで受け入れるようにできます。
value match {
    case n if (条件) => ……処理……
    case n if (条件) => ……処理……
}
こんな具合ですね。これで条件設定を使った分岐が可能となります。ちょっとわかりにくいので、実際の利用例を下にあげておきます。1~12の乱数の値を取得し、その値によって表示を変えています。case 1といった単純な値の指定と、case n:Int if (n < 3)というようにパターンガードを指定したものが組み合わせられていることがわかるでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

import java.util._

object myapp {

    def main(args: Array[String]) {
        val rnd = new Random
        val month = rnd.nextInt(12) + 1
        print(month + "月といえば、")
        month match {
            case 1
                => println("お正月です。")
            case n:Int if (n < 3)
                => println("冬です。")
            case n:Int if (n < 6)
                => println("春です。")
            case 6
                => println("梅雨です。")
            case n:Int if (n < 9)
                => println("夏です。")
            case n:Int if (n < 12)
                => println("秋です。")
            case 12
                => println("今年も終わりです。")
            case _ => println("よくわかりません。")
        }
    }
}
※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る