开发手册 欢迎您!
软件开发者资料库

Scala - 模式匹配

Scala模式匹配 - 从简单和简单的步骤学习Scala,从基本到高级概念,包括Scala语法面向对象语言,特征,方法,模式匹配,元组,注释,指示符,概述,环境设置,基本语法,数据类型,变量,类和对象,访问修饰符,运算符,IF ELSE,循环语句,函数,闭包,字符串,数组,集合,正则表达式,异常处理,提取器,文件I / O.

模式匹配是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

输出

 很多

带有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

输出

2manyone

使用案例类进行匹配

case classes 是与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关键字会使编译器自动添加许多有用的功能.关键字建议在模式匹配中与案例表达式建立关联.

首先,编译器自动将构造函数参数转换为不可变字段(vals). val关键字是可选的.如果需要可变字段,请使用var关键字.所以,我们的构造函数参数列表现在更短.

其次,编译器自动实现 equals,hashCode, toString 方法class,使用指定为构造函数参数的字段.所以,我们不再需要自己的toString()方法.

最后, Person 类的主体变为空,因为我们不需要任何方法定义!