Scala - 模式匹配
模式匹配是 Scala 中使用最广泛的第二个特性,仅次于函数值和闭包。 Scala 在处理消息时为模式匹配提供了很好的支持。
模式匹配包括一系列备选方案,每个备选方案都以关键字 case 开头。每个备选方案都包含一个 pattern 和一个或多个 expressions,如果模式匹配,则会对其进行评估。箭头符号 => 将模式与表达式分开。
试试下面的示例程序,它展示了如何匹配一个整数值。
示例
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 表达式相关联。
首先,编译器自动将构造函数参数转换为不可变字段(vals)。 val 关键字是可选的。 如果您想要可变字段,请使用 var 关键字。 因此,我们的构造函数参数列表现在更短了。
其次,编译器自动实现类的equals、hashCode、 和toString 方法,这些方法使用指定为构造函数参数的字段。 因此,我们不再需要自己的 toString() 方法。
最后,Person 类的主体也变为空,因为没有我们需要定义的方法!

