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** 中。使用以下命令编译和执行此程序。
<h3>Command</h3>
<pre><code class="line-numbers">“`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类的简单模式匹配示例。
示例
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 类的主体变为空,因为我们不需要定义任何方法!