我看到您的问题有两种可能的解决方案
1)unapply
扩展 M. Stocker 的答案,您可以像这样组织数据:
trait Op
trait BinaryOp extends Op {
def a: Int
def b: Int
}
object BinaryOp {
def unapply(op: Op) = op match {
case x: BinaryOp => Some((x.a, x.b))
case _ => None
}
}
case class Times(a: Int, b: Int) extends BinaryOp
case class Plus(a: Int, b: Int) extends BinaryOp
case class Div(a: Int, b: Int) extends BinaryOp
用法:
symbol match {
case BinaryOp(a, b) => f(a, b)
case _ => //...
}
2)Product
所有案例类都扩展了Product
特征
这允许您执行以下匹配:
symbol match {
case p: Product if p.productArity == 2 => {
val a = p.productElement(0) //this has type Any, so a cast may be necessary
val b = p.productElement(1)
f(a, b)
}
}
第二种情况更通用,但也是类型不安全的。我推荐第一个解决方案。