きっかけは忘れましたが、何かの記事で見かけてScalaのパターンマッチでOR(|)が使えるということを知りました。
よくよく見ると、これとか
これにも載っていました。
- 作者:デイビッド・ポラック
- 発売日: 2010/03/18
- メディア: 単行本
読んだ時は、頭に残らなかったのかなぁ…。
val hostname = "d.hatena.ne.jp" hostname match { case "localhost" | "d.hatena.ne.jp" => println("known host!") case other => println("unknown...") }
実行すると、
known host!
が結果となります。|でORが表現できていると。
変数に束縛させたければ、括弧で囲って@を付けましょう。
hostname match { case h @ ("localhost" | "d.hatena.ne.jp") => println("known host![%s]".format(h)) case other => println("unknown...") }
シンボル名を使った定数パターンでもOK。
val hostname = "d.hatena.ne.jp" val LocalHost = "localhost" val Hatena = "d.hatena.ne.jp" hostname match { case h @ (LocalHost | Hatena) => println("known host![%s]".format(h)) case other => println("unknown...") }
サンプルとか探してみると、コマンド引数の解析とかに使ってて、なるほどな〜って感じでした。
def parseArg(arg: String): Unit = arg match { case "-h" | "--help" => displayHelp() case "-v" | "--version" => displayVersion() case unknown => unknownArgument(unknown) } private def displayHelp(): Unit = println("print help") private def displayVersion(): Unit = println("This Version is 0.0.1") private def unknownArgument(arg: String): Nothing = sys.error("Unknown Option[%s]".format(arg))