opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

scalaのmatch式 その1

javaでいうswitch文のようなものなのだが、かなり応用範囲が広いのでメモ。
あと長くなりそうなので幾つかに分けてみる。
というわけでまずmatchの文法というか書き方

セレクター式 match {
    case ... => ....
           .
           .
}

という感じの文法。 簡単な例を一つ。

def hoge(x:Any) = {
    x match {
        case "Hello" => "Hello"
        case 0 => "zero"
        case _ => "something else"
    }
}

hoge("Hello") // "Hello"
hoge(0) // "zero"
hoge(1000) // "something else"

という感じになる。xがcaseのあとに続く定数と"=="かを判定して"=="なら"=>"より右の式を評価する。
が、他にもmatchにはいろいろ使い方がある。 例えばこんなの

def hoge(x:Int) = {
    x match {
        case a if a > 0 => printf("%dは0より大きい\n",a)
        case a if a < 0 => printf("%dは0より小さい\n",a)
        case a => printf("aの値は%d\n",a)
    }
}

hoge(10)
hoge(0)
hoge(-10)

このように、caseの中にaなど適当な名前の変数を用意して変数パターンというものが使える。
最後のcaseのaのように単にaと書いただけでは""と同じですべてにmatchしてしまう。 (ただし"case "というように書いてしまうと上のように右辺で値を参照できない)
が、ifを使っていわゆる「ガード条件」を使って上のようにすることができる。
上のプログラムを適当に実行すると次のようになる。

10は0より大きい
aの値は0
-10は0より小さい

また、最後に自分も正直完全に理解はしていないがこんな感じのこともできるってことでメモ

case class Hoge(x:Int,y:Int)
case class Piyo()

val a = Hoge(10,100)
val b = Piyo()
val c = Hoge(200,300)

for(i <- List(a,b,c))
    i match {
        case Hoge(10,100) => println("Hello Hoge")
        case Piyo() => println("Hello Piyo")
        case _ => println("else")
    }

出力は

Hello Hoge
Hello Piyo
else

のようにクラスとそのパラメータが一致しているかの分岐もできるようだ...
ちなみにcase classじゃないと動かない。

続き

Firefox ブラウザ無料ダウンロード