我尝试匹配这样的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
。
归档时间: |
|
查看次数: |
5266 次 |
最近记录: |