为什么我不能在Seq.empty上匹配?

时间:2017-01-04 22:28:34

标签: scala

我尝试匹配这样的seq:

val users: Seq[User] = ....

users match {
  case Seq.empty => ....
  case ..
}

我收到错误说:

stable identifier required, but scala.this.Predef.Set.empty found.

有人可以解释为什么我不能这样做吗?即它背后的理论

2 个答案:

答案 0 :(得分:4)

Seq.applySeq.empty都在GenericCompanion中实现,没有unapply方法,所以你认为模式匹配是不可能的,但是你仍然可以在Seq()上进行模式匹配,因为Seq.unapplySeq()中实现的unapplySeq()可以使其匹配。

来自unapplySeq()文档:

  

在模式匹配中调用此方法{case Seq(...)=> }。

更多背景

集合通过case List() => ...方法实现模式匹配,当编译器看到类似List(42)的内容时,会调用该方法。

有趣的是,List.apply(42)lst match { case List(8) => ... // OK case List.apply(8) => ... // won't compile } 是一回事,但在模式匹配中却不是这样:

Seq()

同样的原则适用于Seq.emptywhile(next_cursor): follower_id=twitter.get_followers_ids(user_id=ids,cursor=next_cursor) time.sleep(60) next_cursor=follower_id['next_cursor']

答案 1 :(得分:2)

Seq()Nil上匹配:

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

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

scala> val b = Seq()
b: Seq[Nothing] = List()

scala> a match {case Seq() => "empty"
     | case _ => "other"
     | }
res1: String = other

scala> b match {case Seq() => "empty"
     | case _ => "other"
     | }
res2: String = empty

由于技术原因,请参阅@jwvh's answer