我正在尝试匹配 a Seq
contains的情况Nothing
。
models.Tasks.myTasks(idUser.toInt) match {
case tasks => tasks.map {
task => /* code here */
}
case _ => "" //matches Seq(models.Tasks)
}
Seq[Nothing]
在模式匹配中如何表示?
我正在尝试匹配 a Seq
contains的情况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"}
话虽如此,我不知道为什么您需要经常强制您的对象被称为特定的具体子类。