我尝试匹配这样的seq:
val users: Seq[User] = ....
users match {
case Seq.empty => ....
case ..
}
我收到错误说:
stable identifier required, but scala.this.Predef.Set.empty found.
有人可以解释为什么我不能这样做吗?即它背后的理论
答案 0 :(得分:4)
Seq.apply
和Seq.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.empty
和while(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。