Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala 2.10.0中,是否可以利用模式匹配中的case类继承?_Scala - Fatal编程技术网

在Scala 2.10.0中,是否可以利用模式匹配中的case类继承?

在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

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

要创建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
}

就我所能理解的问题而言,我没有理由为孩子们使用“案例课程”。希望正确的代码如下所示:

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
}