Scalaプログラミングのサンプルクラスとモードマッチング

2432 ワード

一、総説
今日の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キーワードを持つサブクラス(クラス)を指す.パターンマッチングについては,コードに示すように,自分の興味に応じてマッチングが必要なサンプルを修正することができる.