Scala 如何在继承树中模式匹配抽象父类
我刚接触scala,有java背景 在类继承树中,有没有一种模式匹配超类(或特征)的方法,将叶子作为案例类和节点抽象类或特征?据我所知,案例类继承是不允许的 我认为模式匹配大型继承树中的抽象类将非常有用 在下面的代码中,match语句中的最后一种情况是编译期间出现错误Scala 如何在继承树中模式匹配抽象父类,scala,pattern-matching,case-class,Scala,Pattern Matching,Case Class,我刚接触scala,有java背景 在类继承树中,有没有一种模式匹配超类(或特征)的方法,将叶子作为案例类和节点抽象类或特征?据我所知,案例类继承是不允许的 我认为模式匹配大型继承树中的抽象类将非常有用 在下面的代码中,match语句中的最后一种情况是编译期间出现错误 一个人{ 定义名称:字符串 } 案例类客户(姓名:String,电子邮件:String)扩展个人 员工延伸到个人{ 定义id:Int } 案例类Worker(名称:String,id:Int,skills:Array[Strin
一个人{
定义名称:字符串
}
案例类客户(姓名:String,电子邮件:String)扩展个人
员工延伸到个人{
定义id:Int
}
案例类Worker(名称:String,id:Int,skills:Array[String])扩展了Employee
案例类管理器(名称:String,id:Int,标题:String)扩展了Employee
def流程(p:人员)=p匹配{
案例客户(u,电子邮件)=>电子邮件
案例员工(姓名)=>name+“@acme.com”
}
它没有那么花哨(其他人可能会建议使用结构类型),但它非常实用,我认为:
def process(p: Person) = p match {
case Customer(_, email) => email
case e: Employee => e.name + "@acme.com"
}
如果您需要匹配某些特定的已知值,您可以使用防护装置:
def process(p: Person) = p match {
case Customer(_, email) => email
case e: Employee if e.name == "Joe" => e.name + "@acme.com"
}
您在
Employee
中缺少name
字段,在Employee
的伴生对象中缺少unapply
方法:
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"
}
嗨,谢谢你的回复。你的代码解决了电子邮件的问题,但我正在寻找一个通用的方法。基本上,我想以与case类类似的方式进行模式匹配。这与case类非常接近。但是,当我将'name'设置为常量值时,模式匹配不起作用(例如:case Employee(“John”,41;)=>”john@bar.com"). 我的unapply方法可以支持这种过滤吗?它应该已经可以工作了。对我来说,它实际上是:
println(进程(Worker(“Erik”,2,Array.empty))
我在进程中有这样一个例子:案例员工(“Erik”,2,Array.empty)=>”erik@acme.com“