Seq
が含まれている場合と一致させようとしていますNothing
。
models.Tasks.myTasks(idUser.toInt) match {
case tasks => tasks.map {
task => /* code here */
}
case _ => "" //matches Seq(models.Tasks)
}
Seq[Nothing]
パターンマッチングではどのように表現されますか?
Seq
が含まれている場合と一致させようとしていますNothing
。
models.Tasks.myTasks(idUser.toInt) match {
case tasks => tasks.map {
task => /* code here */
}
case _ => "" //matches Seq(models.Tasks)
}
Seq[Nothing]
パターンマッチングではどのように表現されますか?
空のシーケンスとの照合は次のようになります。
val x: Seq[Nothing] = Vector()
x match {
case Seq() => println("empty sequence")
}
編集:これは、のサブクラスであり、一般的ではないcase Nil
ため、より一般的であることに注意してください。不思議なことに、コンパイラは、型が明示的にとして注釈が付けられている場合との照合に問題はありませんが、型がの非サブクラスである場合は文句を言います。したがって、これを行うことができます:Nil
List
Seq
Nil
Seq
List
Seq
(Vector(): Seq[Int]) match { case Nil => "match" case _ => "no" }
しかし、これではありません(コンパイル時エラーで失敗します):
Vector() match { case Nil => "match" case _ => "no" }
あなたの言いたいことを正しく理解していると仮定すると、何も含まないシーケンスは空です。つまり、次の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"}
そうは言っても、オブジェクトを強制的に特定の具体的なサブクラスとして参照する必要がある理由がよくわかりません。