鉴于用Scala 工作通常意味着和序列打交道,要是能和列表、数组的长度和内容来匹配岂不美哉?下面的例子就做到了,它测试了两个列表来检查它们是否包含4个元素,并且第二个元素是3

// code-examples/Rounding/match-seq-script.scala   

val willWork = List(1, 3, 23, 90)  

val willNotWork = List(4, 18, 52)  

val empty = List()  

for (l <- List(willWork, willNotWork,empty)) {  

  lmatch {  

     case List(_, 3, _, _) => println("Four elements, with the 2ndbeing '3'.")  

      case List(_*) => println("Anyother list with 0 or more elements.")

}  

}

在第二个case 里我们使用了一个特殊的通配符来匹配一个任意大小的List,甚至0个元素,任何元素的值都行。你可以在任何序列匹配的最后使用这个模式来解除长度制约。

回忆一下我们提过的List 的“cons方法,::。表达式a :: list 在一个列表前加入一个元素。你也可以使用这个操作符来从一个列表中解出头和尾。

// code-examples/Rounding/match-list-script.scala  

val willWork = List(1, 3, 23, 90)  

val willNotWork = List(4, 18, 52)  

val empty = List()  

   

def processList(l: List[Any]): Unit = lmatch {  

   case head :: tail =>

       format("%s ", head)

       processList(tail)  

   case Nil => println("")

}  

for (l <- List(willWork, willNotWork,empty)) {  

   print("List: ")  

   processList(l)   

}

processList 方法对List 参数进行匹配。像下面这样开始一个方法定义可能看起来比较奇怪。

         defprocessList(l: List[Any]): Unit = l match {

//  ...  

}

用省略号来隐藏细节以后应该会更加清楚一些。processList 方法实际上是一个跨越了好几行的单指令。

它先匹配head :: tail,这时head 会被赋予这个列表的第一个元素,tail 会被赋予列表剩余的部分。也就是说,我们使用:: 来从列表中解出头和尾。当这个case 匹配的时候,它打印出头,然后递归调用processList 来处理列表尾。

第二个case 匹配空列表,Nil。它打印出一行的最后一个字符,然后终止递归。

更多分享请关注:http://bbs.superwu.cn 关注超人学院微信:BJ-CRXY