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

coo*_*eze 8 scala

我尝试匹配这样的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)

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

jwv*_*wvh 6

两者Seq.applySeq.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

  • @ evan058,`Seq.empty`是一种方法,但是`Seq.apply`也是如此。在运行了一些测试之后,我添加了一些细节。 (2认同)