せまい部屋

web/gameエンジニアのweblog

extractorについて理解

抽出子のunapply自体はなんか把握してて、ちょっと前にscala正規表現で深追いしてないけど忙しいし動くから良しみたいにしてた部分があった。大体こういうの。

val reg = """([0-9]+) ([^ ]+)""".r
something match {
  case reg(num, str) =>
    (num, str)
  case _ =>
    throw new Exception
}

これでいうとnumstrどっから来たんだよ感あったけど、これでキャプチャして各変数に突っ込めてる。

playのformクラスとかも必要なときはapplyとunapply書いてアプリで定義してる型にマッピングさせるとかしてた。

あとeffective scalaでもパターンマッチについて書いてあってunapply使ったマッチングのほうがいんじゃないかみたいに言ってた。

animal match {
  case Dog(breed) => "dog (%s)".format(breed)
  case other => other.species
}

カスタム抽出子を書くのはコンストラクタ (apply) が重複する場合のみとする。さもなければ不自然になる可能性がある。

Regex.scalaあたりはコードにちゃんとscaladoc付いてるから適当に見てったら色々書き方の発見とかありそう。あとscala色々深い。