20

(または を実装する任意のコレクション) でパターン マッチングを使用する方法に関するこの記事を読んだ後、このコレクションでパターン マッチングをテストしました。VectorSeq

scala> x // Vector
res38: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

scala> x match {
     |    case y +: ys => println("y: " + "ys: " + ys)
     |    case Nil => println("empty vector")
     | }
<console>:12: error: pattern type is incompatible with expected type;
 found   : scala.collection.immutable.Nil.type
 required: scala.collection.immutable.Vector[Int]
Note: if you intended to match against the class, try `case _: <none>`
                 case Nil => println("empty vector")
                      ^

dhg説明する答えは次のとおり+:です。

object +: {
  def unapply[T](s: Seq[T]) =
    s.headOption.map(head => (head, s.tail))
}

REPL私にそれを示しています

scala> Vector[Int]() == Nil
res37: Boolean = true

...では、なぜこのcase Nilステートメントを使用できないのVectorですか?

4

1 に答える 1

31

Vector[Int]() == Nil比較対象の型レベルに制約がないため、比較が可能です。一方、 for コレクションの実装を許可するequalsと、コレクションの種類に関係なく、要素ごとの比較を実行できます。

Vector(1, 2, 3) == List(1, 2, 3)  // true!

Nilパターン マッチングでは、タイプがリストに関連していない場合 (それは aです)、空のリスト ( ) のケースはありませんVector

ただし、これを行うことができます:

val x = Vector(1, 2, 3)

x match {
  case y +: ys => println("head: " + y + "; tail: " + ys)
  case IndexedSeq() => println("empty vector")
}

xただし、 head 要素がない場合は技術的に空でなければならないため、ここではデフォルトのケースを使用することをお勧めします。

x match {
  case y +: ys => println("head: " + y + "; tail: " + ys)
  case _ => println("empty vector")
}
于 2013-11-03T19:47:02.670 に答える