Scala-模式匹配
[TOC]
Scala:模式匹配
Scala的模式匹配可以使用类型,通配符,序列,正则表达式,甚至可以深入提取对象的状态
模式匹配可以用在许多代码场景中,最常用于match语句中
简单匹配
代码示例
// file: match-boolean.scala
val bools = Seq(true, false)
for (bool <- bools) {
bool match {
case true => println("Got heads")
case false => println("Got tails")
}
}运行及结果
如果注释掉
case false ...编译器会报错,因为case没有匹配所有可能的结果,如果只想匹配true,可以这样:
匹配值,变量,类型
示例一
代码
运行
说明
像所有表达式一样,match语句也有返回值.在示例一中,所有的子句都返回字符串,因此整个子句的返回值类型为String.编译器会推断所有case子句返回值类型的最近公共父类型
匹配是按顺序进行的,因此默认子句必须是最后一个子句,不然编译器会给出警告
注意浮点数的匹配
示例二
使用反引号表示真正想要匹配的是变量的值
代码
运行及输出
示例三
不同的匹配使用相同的处理代码
代码
运行及输出
小结
在case子句中,以小写字母开头的标识符被认为是用来提取待匹配值的新变量
如果需要引用之前一定以的变量时,应使用反引号将其包围
以大写字母开头的标识符被认为是类型名称
如果不使用变量特有方法,可以使用通配符
_代替变量名及类型声明除了偏函数,所有的match语句都必须是完全覆盖输入的.当输入类型为Any时,在结尾用
case _或case some_name作为默认子句
序列的匹配
Seq是具体的集合类型的父类型,这些集合类型支持以确定顺序遍历其元素,如List和Vector
示例代码
运行输出
我们用表示空List专用的对象Nil来匹配
+:操作符是序列的"构造"操作符上面代码.case子句只匹配至少包含一个头部元素的非空序列,它将序列的头部和剩下的部分分别提取可变变量head和tail中
Seq可以应用于所有子类型,包括List和Vector
元组的匹配
代码示例
运行输出
case中的guard语句
case中的guard语句示例代码
运行
case类的匹配
示例代码
运行及输出
使用@
@代码示例
运行及输出
p @ ... 语法将整个Person类的实例赋值给了变量p,类似地,a @ ...也将整个Address实例赋值给了变量
可变参数列表的匹配
代码示例
运行及输出
说明
可变参数的语法形式:
name @ _*
正则表达式匹配
代码示例
运行及输出
在正则表达式中使用变量插值
在三重双引号内的正则表达式中使用变量插值是无效的,需要对变量插值进行转义,如
s"""$first\\s+$second""".r
最后更新于
这有帮助吗?