Scala编程之样本类与模式匹配

一、总述

       在今天的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关键字的子类(类)。至于模式匹配,就像代码中展示的那样,可以根据自己的兴趣进行修改需要匹配的样本。

猜你喜欢

转载自zh-workhard-java.iteye.com/blog/2272457