一、总述
在今天的Scala编程的学习过程中,发现了Scala语言中十分有趣的东西:样本类、模式匹配。对于样本类和模式匹配的概念,鄙人通过一个自己编写的实例给出对应的说明。
二、实例展示
1、定义一个抽象类Expr,并且在该类的内部定义了几个不同的类,如代码中所示:
/** * Created by user on 2016/1/21. */ abstract class Expr case class Var(name: String) extends Expr case class Number(number: Double) extends Expr case class UnOp(operator: String, arg: Expr) extends Expr case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
2、定义一个模式匹配的类,具体内容如代码中所示:
/** * Created by user on 2016/1/21. */ class PatternMatch(arg: Double){ def simplifyTop(expr: Expr): Expr = expr match { //双重负号 case UnOp("-", UnOp("-",e)) => e //加arg case BinOp("+", e, Number(arg)) => e //乘arg case BinOp("*", e, Number(arg)) => e //除以arg case BinOp("/", e, Number(arg)) => e case _ => expr } }
3、定义object用于测试
/** * Created by user on 2016/1/21. */ object Opt extends App{ //需要匹配的模式样本 val v = Var("x") val binOp = BinOp("+", Number(1), v) val arg = Double.box(10) println("case class test result: " + v.name + "," + binOp.left + "," + (binOp.right == v)) def result1: Expr = new PatternMatch(arg).simplifyTop(UnOp("-",UnOp("-",v))) println("pattern match test result1: " + (result1 == v)) def result2: Expr = new PatternMatch(arg).simplifyTop(BinOp("+",result1,Number(arg))) println("pattern match test result2: " + (result2 == v)) def result3: Expr = new PatternMatch(arg).simplifyTop(BinOp("*",result2,Number(arg))) println("pattern match test result3: " + (result3 == v)) def result4: Expr = new PatternMatch(arg).simplifyTop(BinOp("/",result3,Number(arg))) println("pattern match test result4: " + (result4 == v)) }
三、测试结果
测试结果如附件中图所示。
四、结论
样本类是指带有case关键字的子类(类)。至于模式匹配,就像代码中展示的那样,可以根据自己的兴趣进行修改需要匹配的样本。