scala模式匹配及樣本類
樣本類
1、帶有case關鍵字的類被稱為樣本類;
例如: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(operatot: String,left:Expr,right:Expr) extends Expr
2、樣本類的特點
1)增加與類名一致的工廠方法。即可以將構造的類由new Var("x")該為Var("x");
2) 樣本類參數列表中的所有參數隱式的獲得了val前綴,被當作字段維護;
3)編譯器為你的類添加方法toString、hashCode、equals的自然實現,“==”符號直接轉換為equals方法。
模式匹配
樣本類可以進行模式匹配
例如如下樣本類匹配函數:
def simplifyTop(expr: Expr):Expr = expr match{
case UnOp("-",UnOp("-",e)) => e
case BinOp("+",e,Number(0)) => e
case BinOp("*",e,Number(1)) => e
case _ => expr
}
匹配格式:選擇器 match {備選項}
模式匹配以值作為結果,並且匹配到一個不會進行後面的匹配,如果沒有模式匹配會拋出MatchError的異常。
模式匹配的種類
通配模式 :使用"_"匹配任意對象
常量模式 :常量模式僅僅匹配自身 (val變量或者單例對象也被看作常量,Nil匹配空列表的形式)
變量模式 :變量模式類似於通配符,可以匹配任意對象
構造器模式 :構造器作為匹配項進行匹配,檢查方式:首先檢查對象是該名稱的樣本類成員,然後檢查對象構造器參數類型。
序列模式 : 可以匹配某一個序列格式,例如匹配項為 List(0,_*) ,匹配一個不指定長度的序列
元祖模式 : 還可與匹配元組,例如 (a,b,c)這樣的模式
類型模式 :可以把類型模式當做類型測試以及類型轉換的簡單替代 ,例如:s : String => s.length 匹配一個String類型轉換 為一個Int類型(類型模式裏的“_”代表任何類型)
擦除模式 :
模式匹配中的擦除模式指的是類型參數信息沒有保存到運行期,因此對於類型Map[Int,Int]無法匹配。
變量綁定 :
將一個變量與一個模式綁定,即為變量綁定模式,這種模式的意義在於他能像通常的那樣做模式匹配。例如UnOp(“abs”,e @ UnOp("abs",_)) => e ,匹配成功,那麽符合UnOp(“abs”,_)部分就可以使用e指代,之後e就會保持原樣被返回。
模式守衛 :
模式是線性的,模式變量僅允許在模式中出現一次, 可以使用模式匹配重新制定規則,在匹配是加上判斷條件 例如 case n :Int if 0 < n 匹配正整數
模式重疊 :
模式匹配中如果上一個模式匹配覆蓋下一個模式匹配,或者匹配覆蓋那麽就會報錯。可以調整匹配順序。
封閉類 :
封閉類就是讓類是封閉的,將一個超類定義為一個封閉類,子類繼承超類,定義一個超類類型的匹配變量,如果匹配選項沒有包含所有繼承超類的子類,編譯器就會報錯。定義封閉類的方式在類名前加上sealed 修飾。
Option類型:
Option(x):如果x非空,返回 some(x),如果為空,返回None對象。
scala模式匹配及樣本類