1

ケースクラスの封印されたトリオがあります。Scala は、この一致が完全かどうかを教えてくれますか (私はそうではないと思います)?

value match {
  case a: A => methodThatNeedsA(a)
  case b: B => methodThatNeedsB(b)
  case c: C => methodThatNeedsC(c)
}

私は次のことを行うことができますが、これは網羅的であることを理解していますが、式を分解する必要がないため、非常に面倒に見えます。

value match {
  case a @ A(_) => methodThatNeedsA(a)
  case b @ B(_, _) => methodThatNeedsB(b)
  case c @ C(_, _, _) => methodThatNeedsC(c)
}

純粋にタイプに基づいて、このようにディスパッチするより良い方法はありますか?

4

1 に答える 1

4

私はあなたのコードを次のようにテストしました:

sealed trait Base
case class A(x: Int) extends Base
case class B(x: Int, y: Int) extends Base
case class C(x: Int, y: Int, z: Int) extends Base

caseパターン マッチングで3 つの s のいずれかを削除すると、次のようになります。

value match {
    case a: A => methodThatNeedsA(a)
    case b: B => methodThatNeedsB(b)
    //case c: C => methodThatNeedsC(c)

}

コンパイラは次の警告を発行します。

warning: match is not exhaustive!
missing combination              C
于 2012-11-01T10:03:29.147 に答える