下面是我试图用来说明模式匹配的代码:
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
答案 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 }}秒。