我尝试匹配这样的seq:
val users: Seq[User] = ....
users match {
case Seq.empty => ....
case ..
}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说:
stable identifier required, but scala.this.Predef.Set.empty found.
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么我不能这样做吗?即它背后的理论
两者Seq.apply和Seq.empty都在GenericCompanion中实现,该unapply方法没有方法,因此您会认为模式匹配是不可能的,但是您仍然可以对模式进行匹配,Seq()因为SeqFactory中Seq.unapplySeq()实现的可以使之可用。
从unapplySeq()文档:
在模式匹配{case Seq(...)=>}中调用此方法。
更多背景
集合可通过unapplySeq()方法使模式匹配成为可能,当编译器看到类似时会调用该方法case List() => ...。
有趣的List(42)是,List.apply(42)在模式匹配方面却是相同的,但事实并非如此:
lst match {
case List(8) => ... // OK
case List.apply(8) => ... // won't compile
}
Run Code Online (Sandbox Code Playgroud)
相同的原则适用于Seq()和Seq.empty。