6

https://stackoverflow.com/a/6697749/1092910のように、リストの最後の要素を取得するカスタム エクストラクタを定義しました。

object :+ {
  def unapply[A](l: List[A]): Option[(List[A], A)] = {
    if (l.isEmpty)
      None
    else 
      Some(l.init, l.last)
  }
}

これは「良い」に一致します:

List(1, 2, 3) match {
  case init :+ last => "good"
  case head :: tail => "bad"
}

しかし、別の句を追加すると、突然「悪い」に一致します。

List(1, 2, 3) match {
  case List(7) => "never"
  case init :+ last => "good"
  case head :: tail => "bad"
}

この動作の理由は何ですか?

4

1 に答える 1

6

#1697/2337 で、12 個の重複があります。

https://issues.scala-lang.org/browse/SI-1697

直接的な方法ではなく、virtpatmat 実装のパターン マッチャーを削除することで修正されると言っても過言ではありません。最近のビルドを試して、-Yvirtpatmat でコンパイルすると、正しい答えが得られます。

于 2011-12-12T05:22:08.467 に答える