- Scala Tutorial
- Scala - Home
- Scala - Overview
- Scala - Environment Setup
- Scala - Basic Syntax
- Scala - Data Types
- Scala - Variables
- Scala - Classes & Objects
- Scala - Access Modifiers
- Scala - Operators
- Scala - IF ELSE
- Scala - Loop Statements
- Scala - Functions
- Scala - Closures
- Scala - Strings
- Scala - Arrays
- Scala - Collections
- Scala - Traits
- Scala - Pattern Matching
- Scala - Regular Expressions
- Scala - Exception Handling
- Scala - Extractors
- Scala - Files I/O
- Scala Useful Resources
- Scala - Quick Guide
- Scala - Useful Resources
- Scala - Discussion
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。
尝试以下操作,这是一个使用案例类的简单模式匹配示例。
例子
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 表达式相关联。
首先,编译器自动将构造函数参数转换为不可变字段(val)。val 关键字是可选的。如果您想要可变字段,请使用 var 关键字。因此,我们的构造函数参数列表现在更短了。
其次,编译器自动为类实现equals、hashCode和toString方法,这些方法使用指定为构造函数参数的字段。因此,我们不再需要自己的 toString() 方法。
最后, Person类的主体也变成空的,因为没有我们需要定义的方法!