scala--case類

Scala支持case類的概念。case類也是正規的類,暴露其構造器參數,並經過模式匹配提供遞歸解構機制。 如下是由抽象超類Term和三個具體case類Var,Fun,和App組成的類層次的例子數據結構

  1. abstract class Term  
  2. case class Var(name: String) extends Term  
  3. case class Fun(arg: String, body: Term) extends Term  
  4. case class App(f: Term, v: Term) extends Term 

這個類層次能夠用來表現無類型lambda算子。爲了便於case類實例的構建,Scala不須要使用new原語。只要簡單地把類名用做函數便可。舉例以下:函數

  1. Fun("x", Fun("y", App(Var("x"), Var("y"))))  

case類的構造器參數被看成公開值並能夠直接被訪問。spa

  1. val x = Var("x")  
  2. Console.println(x.name) 

對於每一個case類,Scala編譯器將產生實現告終構相等性檢查的equals方法和一個toString方法。舉例以下:對象

  1. val x1 = Var("x")  
  2. val x2 = Var("x")  
  3. val y1 = Var("y")  
  4. println("" + x1 + " == " + x2 + " => " + (x1 == x2))  
  5. println("" + x1 + " == " + y1 + " => " + (x1 == y1)) 

將打印遞歸

  1. Var(x) == Var(x) => true 
  2. Var(x) == Var(y) => false 

只有在分解數據結構的時候用到了模式匹配的狀況下,定義case類纔是有意義的。如下的對象爲咱們的lambda算子的展現定義了漂亮的打印函數:編譯器

  1. object TermTest extends Application {  
  2.   def printTerm(term: Term) {  
  3.     term match {  
  4.       case Var(n) =>  
  5.         print(n)  
  6.       case Fun(x, b) =>  
  7.         print("^" + x + ".")  
  8.         printTerm(b)  
  9.       case App(f, v) =>  
  10.         Console.print("(")  
  11.         printTerm(f)  
  12.         print(" ")  
  13.         printTerm(v)  
  14.         print(")")  
  15.     }  
  16.   }  
  17.   def isIdentityFun(term: Term): Boolean = term match {  
  18.     case Fun(x, Var(y)) if x == y => true 
  19.     case _ => false 
  20.   }  
  21.   val id = Fun("x", Var("x"))  
  22.   val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))  
  23.   printTerm(t)  
  24.   println  
  25.   println(isIdentityFun(id))  
  26.   println(isIdentityFun(t))  

咱們的例子裏,函數print表達爲開始於match關鍵字的,由一系列的case Pattern => Body子句組成的模式匹配語句。it

上面的程序還定義了函數isIdentityFun,用來檢查是否給定的term對應於一個簡單的身份函數。這個例子使用了深度模式和護衛語句。在使用給定值匹配了模式以後,護衛語句(定義於關鍵字if以後)被執行評估。若是返回true,匹配成功;反之,則匹配失敗,並嘗試下一個模式。io

相關文章
相關標籤/搜索