虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Scala > Scala模式匹配

Scala模式匹配
类别:Scala   作者:码皇   来源:互联网   点击:

模式匹配是Scala中第二个最广泛使用的功能,经过函数值和闭包。Scala中大力支持模式匹配处理消息。模式匹配包括替代的序列,每个开始使用关键字case。每个备选中包括模式和一个或多个表达式,如果模式匹配将被计

模式匹配是Scala中第二个最广泛使用的功能,经过函数值和闭包。Scala中大力支持模式匹配处理消息。

模式匹配包括替代的序列,每个开始使用关键字case。每个备选中包括模式和一个或多个表达式,如果模式匹配将被计算。一个箭头符号=>分开的表达模式。这里是一个小例子,它展示了如何匹配一个整数值:

  1. object Test { 
  2.    def main(args: Array[String]) { 
  3.       println(matchTest(3)) 
  4.  
  5.    } 
  6.    def matchTest(x: Int): String = x match { 
  7.       case 1 => "one" 
  8.       case 2 => "two" 
  9.       case _ => "many" 
  10.    } 

当上述代码被编译和执行时,它产生了以下结果:

  1. C:/>scalac Test.scala 
  2. C:/>scala Test 
  3. many 
  4.  
  5. C:/> 

使用case语句块定义一个函数,该函数映射整数字符串。匹配关键字提供应用函数(如模式匹配函数以上)为一个对象的一个方便的方法。下面是第二个示例,它匹配针对不同类型的模式值:

  1. object Test { 
  2.    def main(args: Array[String]) { 
  3.       println(matchTest("two")) 
  4.       println(matchTest("test")) 
  5.       println(matchTest(1)) 
  6.  
  7.    } 
  8.    def matchTest(x: Any): Any = x match { 
  9.       case 1 => "one" 
  10.       case "two" => 2 
  11.       case y: Int => "scala.Int" 
  12.       case _ => "many" 
  13.    } 

当上述代码被编译和执行时,它产生了以下结果:

  1. C:/>scalac Test.scala 
  2. C:/>scala Test 
  3. many 
  4. one 
  5.  
  6. C:/> 

第一个case ,如果 x 指的是整数值1. 如果x等于字符串“2”的第二case相匹配匹配。第三种case 是由一个输入模式;它匹配针对任何整数,并结合选择值xto整数类型的变量y。以下为文字相同的匹配... case 表达式用括号 {...} 另一种形式:

  1. object Test { 
  2.    def main(args: Array[String]) { 
  3.       println(matchTest("two")) 
  4.       println(matchTest("test")) 
  5.       println(matchTest(1)) 
  6.  
  7.    } 
  8.    def matchTest(x: Any){ 
  9.       x match { 
  10.          case 1 => "one" 
  11.          case "two" => 2 
  12.          case y: Int => "scala.Int" 
  13.          case _ => "many" 
  14.       } 
  15.    } 

匹配使用case 类:

case classes是用于模式匹配与case 表达式指定类。这些都是标准类具有特殊修饰:case。下面是一个简单的模式使用case class匹配示例:

  1. object Test { 
  2.    def main(args: Array[String]) { 
  3.     val alice = new Person("Alice", 25) 
  4.        val bob = new Person("Bob", 32) 
  5.     val charlie = new Person("Charlie", 32) 
  6.     
  7.       for (person <- List(alice, bob, charlie)) { 
  8.          person match { 
  9.             case Person("Alice", 25) => println("Hi Alice!") 
  10.             case Person("Bob", 32) => println("Hi Bob!") 
  11.             case Person(name, age) => 
  12.                println("Age: " + age + " year, name: " + name + "?") 
  13.          } 
  14.       } 
  15.    } 
  16.    // case class, empty one. 
  17.    case class Person(name: String, age: Int) 

 

当上述代码被编译和执行时,它产生了以下结果:

  1. C:/>scalac Test.scala 
  2. C:/>scala Test 
  3. Hi Alice! 
  4. Hi Bob! 
  5. Age: 32 year, name: Charlie? 
  6.  
  7. C:/> 

增加 case 关键字使编译器自动添加了许多实用的功能。关键字建议与模式匹配的情况下表达式的关联。

首先,编译器会自动转换的构造函数的参数为不可变的字段(vals)。val关键字是可选的。如果想可变字段,使用var关键字。因此,构造函数的参数列表现在更短。

其次,编译器自动实现equals, hashCode, 和toString方法的类,它使用指定为构造函数参数的字段。因此,不再需要自己的toString方法。

最后,还消失Person类的主体部分,因为没有需要定义的方法!

相关热词搜索: 模式
上一篇:Scala类与对象
下一篇:Scala正则表达式