構(gòu)造器模式功能非常強(qiáng)大,比如一個(gè)構(gòu)造器模式可以定義為 BinOp(“+”,e,Number(0))。它由一個(gè)名稱 BinOp(某個(gè) case class 的名稱)和一系列有括號分開的模式構(gòu)成(“+”,e 和 Number(0))。這個(gè)模式首先檢查輸入對象是否是 BinOp 類型的對象,然后檢查構(gòu)造器參數(shù)是否匹配輸入的對象。
這些額外的模式表示 Scala 支持深度匹配,這些模式不僅僅檢查最高層次的匹配,并且檢查其內(nèi)部內(nèi)容的匹配,同時(shí)這些額外的模式自身還可以說構(gòu)造器模式,因此你可以構(gòu)造嵌套任意層次的構(gòu)造器模式。 比如
expr match{
case BinOp("+",e,Number(0)) => println(" a deep match")
case _ =>
}
它的第三個(gè)參數(shù) Number(0) 自身也是一個(gè)構(gòu)造器模式,其參數(shù)又匹配 0,因此有三個(gè)層次的匹配。
你也可以匹配如 List 和數(shù)組等序列類型的數(shù)據(jù)。和匹配 case class 語法類似,但你可以指明序列中任意數(shù)量的元素。比如:
下面的例子匹配含三個(gè)元素,其中首元素為 0 的列表:
scala> List(0,2,4) match{
| case List(0,_,_) => print ("found it " )
| case _ =>
| }
found it
如果你需要匹配一個(gè)未指明長度的序列,可以使用“_*” 作為模式的后一元素,這個(gè)“_*” 可以匹配任意數(shù)目的元素(包括 0 個(gè)元素)
expr match{
case List(0,_*) => print ("found it")
case _ =>
}
除序列外,你可以匹配多元組,比如:
scala> def tupleDemo(expr:Any) =
| expr match{
| case (a,b,c) => print("matched " + a +":" +b +":"+c )
| case _ =>
| }
tupleDemo: (expr: Any)Unit
scala> tupleDemo(2,3,4)
matched 2:3:4