CLOVER🍀

That was when it all began.

ScalaのパターンマッチでORを使う

きっかけは忘れましたが、何かの記事で見かけてScalaのパターンマッチでOR(|)が使えるということを知りました。

よくよく見ると、これとか

Scala逆引きレシピ

Scala逆引きレシピ

これにも載っていました。
SCALAプログラミング入門

SCALAプログラミング入門

読んだ時は、頭に残らなかったのかなぁ…。

例えば、こんなScalaスクリプトを用意して

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))