dd

Scala 专题教程-Case Class和模式匹配(3): 模式的种类(二)

jerry Scala 2015年11月25日 收藏

构造器模式
构造器模式功能非常强大,比如一个构造器模式可以定义为 BinOp(?+?,e,Number(0)). 它由一个名称BinOp(某个case class的名称)和一系列有括号分开的模式构成(“+”,e和Number(0)).这个模式首先检查输入对象是否是BinOp类型的对象,然后检查构造器参数是否匹配输入的对象。
这些额外的模式表示Scala支持深度匹配,这些模式不仅仅检查最高层次的匹配,并且检查其内部内容的匹配,同时这些额外的模式自身还可以说构造器模式,因此你可以构造嵌套任意层次的构造器模式。
比如

expr match{
	case BinOp("+",e,Number(0)) => println(" a deep match")
	case _ =>
}

它的第三个参数Number(0)自身也是一个构造器模式,其参数又匹配0,因此有三个层次的匹配。

序列模式
你也可以匹配如List和数组等序列类型的数据。和匹配case class语法类似,但你可以指明序列中任意数量的元素。比如:
下面的例子匹配含三个元素,其中首元素为0的列表:

scala> List(0,2,4) match{
     | case List(0,_,_) => print ("found it " )
     | case _ =>
     | }
found it 

如果你需要匹配一个未指明长度的序列,可以使用“_*” 作为模式的后一元素,这个“_*” 可以匹配任意数目的元素(包括0个元素)

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

dd