Scala匹配模式-----序列匹配
2015-05-05 17:02
295 查看
鉴于用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
// 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
相关文章推荐
- Scala By Example: Case 类与模式匹配 习题
- scala-32:List的基本操作实战与基于模式匹配的List排序算法实现
- scala的模式匹配和case class
- List的基本操作实战与基于模式匹配的List排序算法实现之Scala学习笔记-23
- scala学习之模式匹配
- 第13课Scala模式匹配实战
- scala 模式匹配详解 1
- Scala模式匹配-值匹配与简单类型匹配
- Scala学习笔记19【Scala模式匹配入门实战】
- Scala入门到精通——第十五节 Case Class与模式匹配(二)
- Scala--模式匹配和样例类
- scala - 从合并两个Map说开去 - foldLeft 和 foldRight 还有模式匹配
- Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战
- scala 开发入门(8)-- 模式匹配
- Scala 模式匹配下的for循环
- Scala中的模式匹配(Pattern matching)
- Scala-模式匹配
- Scala模式匹配语言,java的替代者
- Scala的模式匹配和条件类
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理