scala – 列表中的案例类和模式匹配
发布时间:2020-12-16 18:19:54 所属栏目:安全 来源:网络整理
导读:我想做的是简化这个表达式 选项(选项(ExpList(名单(选件(选件(VAR( “可
我想做的是简化这个表达式
选项(选项(ExpList(名单(选件(选件(VAR( “可选”))))))) 得到这样的东西 选项(ExpList(名单(选件(VAR( “可选”))))) 匹配表达式的内容看起来像是为了简化列表中的所有表达式. 这些任务的最佳实践是什么? 我试过的代码片段是这样的: object CaseClassPatternMatching extends App { abstract class Expr case class Var(name: String) extends Expr case class Opt(expr: Expr) extends Expr case class ExpList(listExp: List[Expr]) extends Expr def joinOpt(feature: Expr): Expr = feature match { case Opt(Opt(f)) => joinOpt(Opt(f)) // Opt(Opt("test")) --> Opt("test") // case ExpList(list) => ???? // What to do there? case _ => feature } val expr1: Expr = joinOpt(Opt(Opt(Opt(Var("optional"))))) println(Opt(Var("optional"))) // Output: Opt(Var(optional)) --> That one is OK... val expr2: Expr = joinOpt(Opt(Opt(ExpList(List(Opt(Opt(Var("optional")))))))) println(expr2) // Output: Opt(ExpList(List(Opt(Opt(Var(optional)))))) --> Not OK... // How to simplify expressions inside list? } [编辑] 对于那些感兴趣的人,类似的主题: Scala case classes,pattern matching and varargs 解决方法
你需要四个案例:
def joinOpt(feature: Expr): Expr = feature match { // remove extra Opt // (you can use @ to avoid recreating Opt) case Opt(opt @ Opt(_)) => joinOpt(opt) // preserve single Opt case Opt(expr) => Opt(joinOpt(expr)) // apply function to all elements in inner list case ExpList(list) => ExpList(list map joinOpt) case _ => feature } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |