Scala语法可匹配多种案例类类型,而无需分解案例类

时间:2018-10-04 10:57:45

标签: scala syntax pattern-matching case-class

我具有各种案例类实现的密封特征。我想一次在多个类上为相同的匹配表达式匹配模式。我似乎无法做到不分解案例类和“ |”他们之间

当前看起来像:

sealed trait MyTrait {
  val param1: String
  ...
  val param100: String
}

case class FirstCase(param1: String ...... param100: String) extends MyTrait
...
case class NthCase(param1: String ..... param100: String) extends MyTrait

代码中的另一个地方:

def myFunction(something: MyTrait) = {
   ...
   val matchedThing = something match {
      // this doesn't work with "|" character
      case thing: FirstCase | SecondCase => thing.param1
      ...
      case thing: XthCase | JthCase => thing.param10
   }
} 

2 个答案:

答案 0 :(得分:5)

让我们一步一步走到那里:

  1. 在模式匹配的上下文中,|运算符允许您以以下形式定义备用模式

    pattern1 | pattern2
    
  2. 如果要定义与类型匹配的模式,则必须以以下形式提供该模式:

    binding: Type
    
  3. 然后应以以下形式提供两种不同类型之间的选择:

    binding1: Type1 | binding2: Type2
    
  4. 要将单个名称绑定到两个替代绑定,您可以丢弃单个绑定的名称(使用_通配符),然后使用{{将整个模式的名称绑定到另一个绑定1}}运算符,如以下示例所示:

    @

以下是示例:

binding @ (_ : Type1 | _ : Type2)

以下是调用sealed trait Trait { def a: String def b: String } final case class C1(a: String, b: String) extends Trait final case class C2(a: String, b: String) extends Trait final case class C3(a: String, b: String) extends Trait object Trait { def f(t: Trait): String = t match { case x @ (_ : C1 | _ : C2) => x.a // the line you are probably interested in case y: C3 => y.b } } 时的一些示例输出:

f

您可以尝试使用提出的示例here on Scastie

答案 1 :(得分:1)

这对我https://scastie.scala-lang.org/pT4euWh6TFukqiuPr4T6GA有效:

sealed trait Sup {
  def a: String
  def i: Int
}

case class First(a: String, i: Int, d: Double) extends Sup

case class Second(a: String, i: Int, x: Seq[Double]) extends Sup

case class Third(a: String, i: Int, c: Char) extends Sup

val sups = Seq(First("s", 1, 1.0), Second("s", 4, Seq(1.1)), Third("s", 4, 'f'))

sups.foreach {
  case _: First | _: Second => println("ffff")
  case _                    => println("ggg")
}