5

Seqが含まれている場合と一致させようとしていますNothing

models.Tasks.myTasks(idUser.toInt) match {
  case tasks => tasks.map {
    task => /* code here */
  }
  case _ => "" //matches Seq(models.Tasks)
}

Seq[Nothing]パターンマッチングではどのように表現されますか?

4

2 に答える 2

16

空のシーケンスとの照合は次のようになります。

val x: Seq[Nothing] = Vector()

x match { 
  case Seq() => println("empty sequence") 
}

編集:これは、のサブクラスであり、一般的ではないcase Nilため、より一般的であることに注意してください。不思議なことに、コンパイラは、型が明示的にとして注釈が付けられている場合との照合に問題はありませんが、型がの非サブクラスである場合は文句を言います。したがって、これを行うことができます:NilListSeqNilSeqListSeq

(Vector(): Seq[Int]) match { case Nil => "match" case _ => "no" }

しかし、これではありません(コンパイル時エラーで失敗します):

Vector() match { case Nil => "match" case _ => "no" }
于 2012-10-25T12:10:23.920 に答える
10

あなたの言いたいことを正しく理解していると仮定すると、何も含まないシーケンスは空です。つまり、次のNilとおりです。

case Nil => //do thing for empty seq

Seqこれは、 ではなく sを扱っていても機能しますLists

scala> Seq()
res0: Seq[Nothing] = List()

scala> Seq() == Nil
res1: Boolean = true

これが の他のサブクラスで完全に正常に動作することを示すために、さらにいくつかの REPL 出力を示しますSeq

scala> Nil
res3: scala.collection.immutable.Nil.type = List()

scala> val x: Seq[Int] = Vector()
x: Seq[Int] = Vector()

scala> x == Nil
res4: Boolean = true

scala> x match { case Nil => "it's nil" }
res5: java.lang.String = it's nil

scala> val x: Seq[Int] = Vector(1)
x: Seq[Int] = Vector(1)

scala> x match { case Nil => "it's nil"; case _ => "it's not nil" }
res6: java.lang.String = it's not nil

上記の出力からわかるように、Nilはすべて独自の型です。この質問には、この問題について興味深いことがいくつかあります。

しかし @dhg は正しいです。ベクトルなどの特定のサブタイプを手動で作成すると、一致は機能しません。

scala> val x = Vector()
x: scala.collection.immutable.Vector[Nothing] = Vector()

scala> x match { case Nil => "yes"} 
<console>:9: error: pattern type is incompatible with expected type;
 found   : object Nil
 required: scala.collection.immutable.Vector[Nothing]
              x match { case Nil => "yes"} 

そうは言っても、オブジェクトを強制的に特定の具体的なサブクラスとして参照する必要がある理由がよくわかりません。

于 2012-10-25T12:01:11.320 に答える