13
12

More than 5 years have passed since last update.

Scala: その警告、気付いてる? パターンマッチングの漏れをちゃんと検出する方法

Last updated at Posted at 2014-04-02

課題

パターンマッチに使うクラスに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 に代わりコンパイルが失敗する。これでパターンマッチングの漏れに気付けるようになる。

13
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12