当模式匹配案例类时,你如何实际引用它匹配的类?
这是一个展示我的意思的例子:
sealed trait Value
case class A(n: Int) extends Value
v match {
case A(x) =>
doSomething(A);
}
其中v
的类型值和doSomething
的参数类型为A
,而不是Value
。
做这个
v match {
case a @ A(x) =>
doSomething(a)
}
@
被称为Pattern Binder(参见§8.1.3)。来自参考:
图案装订器x @ p由图案变量x和图案p组成。变量x的类型是模式p的静态类型T.此模式匹配模式p匹配的任何值v,前提是v的运行时类型也是T的实例,并且它将变量名称绑定到该值。
v match {
a @ case A(x) =>
doSomething(a)
}
顺便说一下,你不需要分号。
案例类是解构的
您不会引用A,因为您将引用解构对象,因此您只能在案例的上下文中访问x。
但是,您会知道上下文是A,因为您匹配了大小写,因此从您的参数构造一个新的case类很容易。