给出两种代数数据类型:A
和Foo
:
scala> sealed trait A
defined trait A
scala> case object B extends A
defined object B
scala> sealed trait Foo
defined trait Foo
scala> case class FooImpl(x: Int) extends Foo
defined class FooImpl
一个简单的函数f
:
scala> def f: Foo = FooImpl(5)
f: Foo
最后,我有几个嵌套的match
语句/表达式:
scala> def hoobar(x: A): Int = x match {
| case B(_) => f match {
| case FooImpl(_) => ???
| }
| }
<console>:18: error: object B is not a case class, nor does it have an unapply/unapplySeq member
case B(_) => f match {
^
为什么会出现上述错误? B
肯定是case class
,不是吗?
答案 0 :(得分:3)
B(_)
是一个案例对象,而不是案例类。 _
没有意义。当只有一个对象B
时,B
会替代什么?
如果你想在case B => ...
上匹配一个特定的对象,请使用(如果是小写则需要后退):
unapply
虽然可以通过为B
提供case object B extends A {
def unapply(b: this.type): Option[this.type] = Some(b)
}
方法来使其他语法工作,但它实际上并没有用。
{{1}}