Scala:模式匹配Seq [Nothing]

And*_*rew 4 scala

我试图匹配Seq包含的情况Nothing.

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

如何Seq[Nothing]在模式匹配中表示?

dhg*_*dhg 12

匹配空序列看起来像这样:

val x: Seq[Nothing] = Vector()

x match { 
  case Seq() => println("empty sequence") 
}
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,这是一般的,case Nil因为Nil只是一个子类List,而不是Seq一般.奇怪的是,编译器可以匹配,Nil如果类型被明确注释为Seq,但如果类型是任何非子List类,它会抱怨Seq.因此你可以这样做:

(Vector(): Seq[Int]) match { case Nil => "match" case _ => "no" }
Run Code Online (Sandbox Code Playgroud)

但不是这个(编译时错误失败):

Vector() match { case Nil => "match" case _ => "no" }
Run Code Online (Sandbox Code Playgroud)


Rus*_*ell 9

假设我理解你的意思正确,包含任何内容的序列都是空的,即Nil:

case Nil => //do thing for empty seq
Run Code Online (Sandbox Code Playgroud)

即使您正在处理Seqs,这仍然有效,而不是Lists:

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

scala> Seq() == Nil
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)

一些更多的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
Run Code Online (Sandbox Code Playgroud)

从上面的输出中可以看出,它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"} 
Run Code Online (Sandbox Code Playgroud)

话虽如此,我不知道为什么你需要强迫你的对象经常被称为特定的具体子类.