1. 程式人生 > >scala模式匹配及樣本類

scala模式匹配及樣本類

cas 增加 符號 size 成功 沒有 類類型 種類 返回

樣本類

  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模式匹配及樣本類