我具有各种案例类实现的密封特征。我想一次在多个类上为相同的匹配表达式匹配模式。我似乎无法做到不分解案例类和“ |”他们之间
当前看起来像:
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
}
}
答案 0 :(得分:5)
让我们一步一步走到那里:
在模式匹配的上下文中,|
运算符允许您以以下形式定义备用模式:
pattern1 | pattern2
如果要定义与类型匹配的模式,则必须以以下形式提供该模式:
binding: Type
然后应以以下形式提供两种不同类型之间的选择:
binding1: Type1 | binding2: Type2
要将单个名称绑定到两个替代绑定,您可以丢弃单个绑定的名称(使用_
通配符),然后使用{{将整个模式的名称绑定到另一个绑定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")
}