scala - 如何在多模式匹配子句中绑定变量名

scala - how to bind a variable name in a multiple pattern matching clause

我想使用相同的“case”与 2 个不同的 case classes 进行模式匹配,但我收到一个错误消息,指出绑定变量名称已在使用中:

例如这个:

statement match {
  case FirstCase(a,b) => {lots of logic using "a" and "b"}
  case SecondCase( obj : FirstCase, somethingElse) => {same logic as above}
  ...
  ...
}

我想重复使用相同的逻辑:

statement match {
  case obj: FirstCase | SecondCase( obj : FirstCase, somethingElse) => 
{lots of logic using "obj.a" and "obj.b"}
  ...
  ...
}

但是我遇到编译错误"obj is already defined in scope"

是否可以"re-use"绑定对象的名称?

您可以使用辅助方法:

  def hlp(a: TypeOfA, b: TypeOfB) = ???

  statement match {
    case FirstCase(a, b) => hlp(a, b)
    case SecondCase(FirstCase(a, b), somethingElse) => hlp(a, b)
  }

其他答案的几个备选方案:

您可以使用中间变量:

val (a,b) = statement match {
   case FirstCase(a,b) => a -> b
   case SecondCase(FirstCase(a,b), somethingElse) => a -> b
}
// Use a and b

您可以创建提取器对象

object AB {
  def unapply(x: Any) = x match {
   case FirstCase(a,b) => Some(a -> b)
   case SecondCase(FirstCase(a,b), somethingElse) => Some(a -> b)
 }
}

statement match {
   case AB(a,b) => // use a and b here (you don't need the braces btw
}