在Scala 2.10.0中,是否可以利用模式匹配中的case类继承?
我找不到这个简单问题的答案,可能是我使用了错误的关键字进行搜索 要创建AST,我需要诸如Number、Add、Sub、Mul、Div等节点。 由于许多数学运算共享相同的结构,如何在相同的模式匹配情况下处理它们?例如,下面的行被认为在语法上不正确:在Scala 2.10.0中,是否可以利用模式匹配中的case类继承?,scala,Scala,我找不到这个简单问题的答案,可能是我使用了错误的关键字进行搜索 要创建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 Exp
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
}
就我所能理解的问题而言,我没有理由为孩子们使用“案例课程”。希望正确的代码如下所示:
object AST {
sealed abstract class Expr
case class MathOp(e1: Expr, e2: Expr) extends Expr
case class Number extends Expr
class Add(e1: Expr, e2: Expr) extends MathOp(e1, e2)
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类所做的远不止添加模式匹配提取器,例如,它们添加了相等、乘积迭代器和算术等,因此发生在继承下。因此,case类继承以前是不推荐的,现在在Scala 2.10中是不可能的 对于您的情况,您需要一个自定义提取器(
unapply
method):
事实上,我需要在稍后对子案例进行模式匹配。。。有什么帮助吗?返回到
案例类
和覆盖val
禁止args.case-to-case继承。伟大的什么是非叶提取器?Case类和继承就像油和肥皂;它们混不好。组合它们的风险由您自己承担。我以前见过这种解决方法(这可能是官方的),但在我看来,当一个人使用case类时,至少在模式匹配方面,他是在寻求简单性。但是好的,我可以在AST对象内划出一个不可触及的区域,以保留traits
和unplies
或找到某种方法来封装它们。
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
}