gpt4 book ai didi

scala - 是否可以在 Scala 2.10.0 中的模式匹配中利用案例类继承?

转载 作者:行者123 更新时间:2023-12-05 01:08:25 24 4
gpt4 key购买 nike

我找不到这个简单问题的答案,也许我使用了错误的关键字进行搜索。

要创建 AST,我需要诸如 Number、Add、Sub、Mul、Div 等节点。
由于许多数学运算共享相同的结构,我如何在相同的模式匹配情况下处理它们?例如。据说下面的行在语法上不正确:

object AST {
sealed abstract class Expr
case class MathOp(e1: Expr, e2: Expr) extends Expr
case class Number extends Expr

case class Add(e1: Expr, e2: Expr) extends MathOp(e1, e2)
case class Sub(e1: Expr, e2: Expr) extends MathOp(e1, e2)
}

目的是能够做到:
expr match {
case MathOp(e1: Expr, e2: Expr) => //do something that would be done to Add, Sub, Mul, Div
case Number => //do another thing
}

最佳答案

case 类所做的不仅仅是添加模式匹配提取器,例如他们添加了相等性、乘积迭代器和元数等,所以 odd things发生在继承下。因此,案例类继承以前被弃用,现在在 Scala 2.10 中是不可能的。

对于您的情况,您需要一个自定义提取器( unapply 方法):

object AST {
sealed trait Expr
object MathOp {
def unapply(m: MathOp): Option[(Expr, Expr)] = Some(m.e1 -> m.e2)
}
sealed trait MathOp extends Expr {
def e1: Expr
def e2: Expr
}
case class Number extends Expr

case class Add(e1: Expr, e2: Expr) extends MathOp
case class Sub(e1: Expr, e2: Expr) extends MathOp
}

Related question

关于scala - 是否可以在 Scala 2.10.0 中的模式匹配中利用案例类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17187722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com