了解与示例代码匹配的模式

时间:2012-10-23 21:53:21

标签: scala

下面是我试图用来说明模式匹配的代码:

package patternmatching

object patterntest {

    abstract class Expr
    case class Var(name: String) extends Expr
    case class Number(num: Double) extends Expr
    case class UnOp(operator: String , arg: Expr) extends Expr
    case class BinOp(operator: String, left: Expr, right: Expr) extends Expr

    def simplifyTop(expr: Expr): Expr = expr match {
      case UnOp("-", UnOp("-", e)) => e //double negation
      case BinOp("+", e, Number(0)) => e  //adding zero
      case BinOp("*", e, Number(1)) => e //Mutiplying by one
      case _ => expr
    }


   def main(args: Array[String]) {
      UnOp("-" , UnOp("-", e))
    }

}

我如何测试每种模式?行UnOp(“ - ”,UnOp(“ - ”,e))  在main方法中给出了一个错误:

not found: value e

1 个答案:

答案 0 :(得分:1)

首先,将main方法替换为以下方法:

def main(args: Array[String]) {
  val sample = UnOp("-" , UnOp("-", Number(0)) // no more undefined variable
  val simplified = simplifyTop(sample)
  println(simplified)
}

它可能会打印类似Number(0)的内容,它与第一个案例表达式匹配。

就个人而言,我喜欢认为案例类构造值和模式匹配解构它们。在使用模式匹配解构值的过程中,您还可以将片段绑定到变量。匹配发生后,您可以使用这些变量。

例如,simplifyTop BinOp("+", e, Number(0)) expr匹配时operator是BinOp,其right字段的值为“+”且left字段为Expr值“Number(0)”,e字段可以包含case BinOp("+", Number(l), Number(r)) => Number(l+r)的任何实例,其值将绑定到变量Number

另一个例子是{{1}},这个案例不仅会提取 - Scala术语中的解构 - BinOp类型的外部值,还有它的内部部分,{{1 }}秒。