- Scala 教程
- Scala - 首页
- Scala - 概述
- Scala - 特性
- Scala - 环境设置
- Scala - 构建工具 (SBT)
- Scala - 基本语法
- 数据类型和变量
- Scala - 数据类型
- Scala - 变量
- Scala - 字符串
- Scala - 数组
- Scala 运算符
- Scala - 运算符
- Scala - 算术运算符
- Scala - 关系运算符
- Scala - 逻辑运算符
- Scala - 位运算符
- Scala - 赋值运算符
- Scala 条件语句
- Scala - IF ELSE
- Scala 循环语句
- Scala - 循环语句
- Scala - while 循环
- Scala - do-while 循环
- Scala - for 循环
- Scala - break 语句
- Scala 类和对象
- Scala - 类和对象
- Scala - 访问修饰符
- Scala 方法和函数
- Scala - 函数
- Scala - 函数按名称调用
- Scala - 带命名参数的函数
- Scala - 带可变参数的函数
- Scala - 递归函数
- Scala - 默认参数值
- Scala - 高阶函数
- Scala - 嵌套函数
- Scala - 匿名函数
- 部分应用函数
- Scala - 柯里化函数
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 映射
- Scala - 元组
- Scala - 迭代器
- Scala - 选项
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 异常处理
- Scala - 提取器
- Scala - 正则表达式
- Scala 文件 I/O
- Scala - 文件 I/O
- Scala 高级概念
- Scala - 闭包
- Scala - 特质
- Scala 有用资源
- Scala - 快速指南
- Scala - 在线编译器
- Scala - 有用资源
- Scala - 讨论
Scala - 模式匹配
模式匹配是 Scala 中仅次于函数值和闭包的第二大常用特性。Scala 在处理消息时提供了对模式匹配的大力支持。
模式匹配包括一系列备选方案,每个备选方案都以关键字case开头。每个备选方案都包含一个模式和一个或多个表达式,如果模式匹配,则将评估这些表达式。箭头符号=>将模式与表达式分隔开。
尝试以下示例程序,该程序演示了如何针对整数值进行匹配。
示例
object Demo { def main(args: Array[String]) { println(matchTest(3)) } def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
many
包含 case 语句的块定义了一个函数,该函数将整数映射到字符串。match 关键字提供了一种方便的方法来将函数(如上面的模式匹配函数)应用于对象。
尝试以下示例程序,该程序将值与不同类型的模式进行匹配。
示例
object Demo { def main(args: Array[String]) { println(matchTest("two")) println(matchTest("test")) println(matchTest(1)) } def matchTest(x: Any): Any = x match { case 1 => "one" case "two" => 2 case y: Int => "scala.Int" case _ => "many" } }
将上述程序保存在Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
2 many one
使用 Case 类进行匹配
Case 类是在模式匹配中与 case 表达式一起使用的特殊类。在语法上,它们是带有特殊修饰符的标准类:case。
尝试以下示例,这是一个使用 case 类的简单模式匹配示例。
示例
object Demo { def main(args: Array[String]) { val alice = new Person("Alice", 25) val bob = new Person("Bob", 32) val charlie = new Person("Charlie", 32) for (person <- List(alice, bob, charlie)) { person match { case Person("Alice", 25) => println("Hi Alice!") case Person("Bob", 32) => println("Hi Bob!") case Person(name, age) => println( "Age: " + age + " year, name: " + name + "?") } } } case class Person(name: String, age: Int) }
将上述程序保存在Demo.scala中。以下命令用于编译和执行此程序。
命令
\>scalac Demo.scala \>scala Demo
输出
Hi Alice! Hi Bob! Age: 32 year, name: Charlie?
添加 case 关键字会导致编译器自动添加许多有用的功能。该关键字表示与模式匹配中的 case 表达式相关联。
首先,编译器会自动将构造函数参数转换为不可变字段 (vals)。val 关键字是可选的。如果需要可变字段,请使用 var 关键字。因此,我们的构造函数参数列表现在更短了。
其次,编译器会自动为类实现equals、hashCode和toString方法,这些方法使用指定为构造函数参数的字段。因此,我们不再需要自己的 toString() 方法。
最后,Person类的主体也变为空,因为没有我们需要定义的方法!
广告