返回首页 Scala 专题教程

重叠模式定义

Scala 在匹配模式时,按照模式定义的顺序依次检查,因此越特定的规则越要先定义,而通用的规则后定义。比如我们修改之前的

    def simplifyTop(expr :Expr) :Expr = expr match {
     case UnOp("-",UnOp("-",e))=>e
     case BinOp("+",e,Number(0))=>e
     case BinOp("*",e,Number(1))=>e
     case _ => expr

     }

使它可以简化任意层次的表达式,我们需要添加两个通用的规则,定义如下:

    def simplifyAll(expr :Expr) :Expr = expr match {
     case UnOp("-",UnOp("-",e))=>e
     case BinOp("+",e,Number(0))=>e
     case BinOp("*",e,Number(1))=>e
     case UnOp(op,e) => UnOp(op,simplifyAll(e))
     case BinOp(op,l,r)=>BinOp(op,simplifyAll(l),simplifyAll(r))
     case _ => expr

     }

simplifyAll 规则 1 是规则 4 的特例,而规则 2,3 是规则 5 的特例,因此 1,2,3 需要定义在 4,5 之前,而最后的缺省规则需要放在最后,如果顺序反了,比如把通用的规则放在特例之前,编译器会给出警告,因为当 Scala 做匹配时,按照规则定义的顺序,首先匹配通用规则,规则匹配成功,后面的特例没有机会匹配,比如:

    def simplifyBad(expr:Expr):Expr = expr match{
        case UnOp(op,e) => UnOp(op,simplifyBad(e))
        case UnOp("-",UnOp("-",e))=>e
    }

    <console>:12: warning: unreachable code
       case UnOp("-",UnOp("-",e))=>e
       ^
    simplifyBad: (expr: Expr)Expr
上一篇: 模式限定修饰 下一篇: Sealed Classes