課題
パターンマッチに使うクラスにsealedを付加しておくと、パターンの記述漏れをコンパイル時に検出できると言うが…
object MyApp extends App {
sealed trait Color
case object Red extends Color
case object Green extends Color
case object Blue extends Color
def printColor(color: Color) = color match {
case Red => println("red")
case Green => println("green")
// ここにBlueのケースが無いことに注意
}
}
warningが出るだけ。コンパイルは通ってしまう。
% scalac MyApp.scala
MyApp.scala:7: warning: match may not be exhaustive.
It would fail on the following input: Blue
def printColor(color: Color) = color match {
^
one warning found
warningを見過ごすとパターンマッチングの漏れに気付けない。
解決策
-Xfatal-warnings
をつける
% scalac MyApp.scala -Xfatal-warnings
MyApp.scala:7: error: match may not be exhaustive.
It would fail on the following input: Blue
def printColor(color: Color) = color match {
^
one error found
sbtの場合は build.sbt にオプションを設定する
build.sbt
scalacOptions ++= Seq("-Xfatal-warnings")
warning が error に代わりコンパイルが失敗する。これでパターンマッチングの漏れに気付けるようになる。