鉴于用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 参数l 进行匹配。像下面这样开始一个方法定义可能看起来比较奇怪。
defprocessList(l: List[Any]): Unit = l match {
// ...
}
用省略号来隐藏细节以后应该会更加清楚一些。processList 方法实际上是一个跨越了好几行的单指令。
它先匹配head :: tail,这时head 会被赋予这个列表的第一个元素,tail 会被赋予列表剩余的部分。也就是说,我们使用:: 来从列表中解出头和尾。当这个case 匹配的时候,它打印出头,然后递归调用processList 来处理列表尾。
第二个case 匹配空列表,Nil。它打印出一行的最后一个字符,然后终止递归。
更多分享请关注:http://bbs.superwu.cn 关注超人学院微信:BJ-CRXY