kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

初学者向けの Scala Tips (3) - 型に対するマッチより構造に対するマッチ

皆さんご存知の通り、Scalaにはパターンマッチという機能があります。この機能、しばしば型に対するswitch-caseとして使われていることがあるようです。

たとえば、

sealed trait class Value
case class Hoge(value: Int) extends Value
case class Foo(value: String) extends Value
case class Bar(value: List[String]) extends Value

というコードがあったとき、しばしば

value match {
  case hoge:Hoge => doHoge(hoge.value)
  case foo:Foo => doFoo(foo.value)
  case bar:Bar => doBar(bar.value)
}

のような形で使われることがあります。このような使い方は場合によって必要なのですが、上記のようなコードでは全く不要です。以下のように機械的に書き換えてしまいましょう。

value match {
  case Hoge(value) => doHoge(value)
  case Foo(value) => doFoo(value)
  case Bar(value) => doBar(value)
}

今回のようなケースではさほど差はあらわれませんが、より複雑なデータ構造をパターンマッチで分解するとき、型に対するswitch-caseを使うのとそうでないのとでは大きな差が出てきます。型に対するswitch-caseはあくまで必要悪です。使わずに済むならそれにこしたことはないということをよく覚えておいてください。

ではでは、また。