构造器模式
构造器模式功能非常强大,比如一个构造器模式可以定义为 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