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类的匹配

示例代码

运行及输出

使用@

代码示例

运行及输出

  • p @ ... 语法将整个Person类的实例赋值给了变量p,类似地,a @ ...也将整个Address实例赋值给了变量

可变参数列表的匹配

代码示例

运行及输出

说明

  • 可变参数的语法形式: name @ _*

正则表达式匹配

代码示例

运行及输出

在正则表达式中使用变量插值

  • 在三重双引号内的正则表达式中使用变量插值是无效的,需要对变量插值进行转义,如s"""$first\\s+$second""".r

最后更新于

这有帮助吗?