【问题标题】:Is it possible to take advantage of case class inheritance in pattern matching in Scala 2.10.0?是否可以在 Scala 2.10.0 的模式匹配中利用案例类继承?
【发布时间】:2013-06-20 06:42:20
【问题描述】:

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

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

【问题讨论】:

  • 案例类和继承就像油和肥皂;它们混合不好。将它们组合起来需要您自担风险。

标签: scala


【解决方案1】:

case 类的作用远不止添加模式匹配提取器,例如他们添加了相等、产品迭代器和 arity 等,所以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

【讨论】:

  • 我以前见过这种解决方法(它可能是官方的),但是 IMO 在使用案例类时,至少在模式匹配方面,人们正在寻找简单性。但是好的,我可以在 AST 对象内划定一个不可触摸的区域以保留 traitsunapplies 或找到某种方法来封装/“隐含”它们。
【解决方案2】:

据我所知,我没有理由为孩子们使用“案例课程”。希望正确的代码如下:

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 classesoverride val的参数。
  • 禁止逐个继承。太棒了...什么是无叶提取器?
猜你喜欢
  • 2021-02-14
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2020-08-23
相关资源
最近更新 更多