scala - 如何模式匹配继承树中的抽象父类

标签 scala pattern-matching case-class

我是具有 Java 背景的 Scala 新手。

有没有办法在类继承树中模式匹配父类(super class)(或特征),叶子作为案例类,节点抽象类或特征?据我所知,案例类继承是不允许的。

我认为在大型继承树中匹配抽象类的模式会很有帮助

在下面的代码中,最后一种情况在编译期间匹配语句错误

sealed trait Person {
   def name: String
}

case class Customer(name: String, email: String) extends Person

sealed trait Employee extends Person {
   def id: Int
}

case class Worker(name: String, id: Int, skills: Array[String]) extends Employee

case class Manager(name: String, id: Int, title: String) extends Employee

def process(p: Person) = p match {
   case Customer(_, email) => email
   case Employee(name, _) => name + "@acme.com"
}

最佳答案

您错过了 name字段在 Employee和一个 unapply Employee 的伴随对象中的方法:

sealed trait Employee extends Person {
  def id: Int
  def name: String
}

object Employee {
  def unapply(e: Employee): Option[(String, Int)] =
    Option(e) map { e =>
      (e.name, e.id)
    }
}

通过上述更改,处理方法没有问题:
def process(p: Person) = p match {
  case Customer(_, email) => email
  case Employee(name, _) => name + "@acme.com"
}

关于scala - 如何模式匹配继承树中的抽象父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802330/

相关文章:

reflection - 案例类上的 `productElement(i)`是否使用反射?

scala - 函数字面量 vs 函数值

scala - 未装箱的标记类型安全吗?

java - 如何搜索字符串模式?

scala - 将元组转换为具有默认值的案例类

scala - 我该如何管理案例类的构造函数?

java - 了解集群状态更新

scala - Spark : Replicate each row but with change in one column value

java - 在更大的 2D 数组中查找 2D 数组

JavaScript 正则表达式 : Find a tag and get some attribute values