Scala模式匹配引用

问题描述 投票:3回答:3

当模式匹配案例类时,你如何实际引用它匹配的类?

这是一个展示我的意思的例子:

sealed trait Value
case class A(n: Int) extends Value

v match {
  case A(x) =>
   doSomething(A);
}

其中v的类型值和doSomething的参数类型为A,而不是Value

scala pattern-matching
3个回答
10
投票

做这个

v match {
   case a @ A(x) =>
   doSomething(a)
}

@被称为Pattern Binder(参见§8.1.3)。来自参考:

图案装订器x @ p由图案变量x和图案p组成。变量x的类型是模式p的静态类型T.此模式匹配模式p匹配的任何值v,前提是v的运行时类型也是T的实例,并且它将变量名称绑定到该值。


1
投票
v match {
  a @ case A(x) =>
    doSomething(a)
}

顺便说一下,你不需要分号。


0
投票

案例类是解构的

您不会引用A,因为您将引用解构对象,因此您只能在案例的上下文中访问x。

但是,您会知道上下文是A,因为您匹配了大小写,因此从您的参数构造一个新的case类很容易。

© www.soinside.com 2019 - 2024. All rights reserved.