无涯教程-Scala - 模式匹配

57 阅读2分钟

在函数值和闭包之后,模式匹配是Scala第二广泛使用的函数, Scala在处理消息时为模式匹配提供了强大的支持。

Pattern - 示例

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关键字提供了将函数(如上面的模式匹配函数)应用于对象的便捷方法。

Pattern - 示例

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)
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">person </span><span class="pun">&lt;-</span><span class="pln"> </span><span class="typ">List</span><span class="pun">(</span><span class="pln">alice</span><span class="pun">,</span><span class="pln"> bob</span><span class="pun">,</span><span class="pln"> charlie</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     person match </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Person</span><span class="pun">(</span><span class="str">"Alice"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">25</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> println</span><span class="pun">(</span><span class="str">"Hi Alice!"</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Person</span><span class="pun">(</span><span class="str">"Bob"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">32</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> println</span><span class="pun">(</span><span class="str">"Hi Bob!"</span><span class="pun">)</span><span class="pln">
        </span><span class="kwd">case</span><span class="pln"> </span><span class="typ">Person</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> age</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> println</span><span class="pun">(</span><span class="pln">
           </span><span class="str">"Age: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> age </span><span class="pun">+</span><span class="pln"> </span><span class="str">" year, name: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name </span><span class="pun">+</span><span class="pln"> </span><span class="str">"?"</span><span class="pun">)</span><span class="pln">
     </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

} case class Person(name: String, age: Int) }

将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。

\>scalac Demo.scala
\>scala Demo
Hi Alice!
Hi Bob!
Age: 32 year, name: Charlie?

首先,编译器自动将构造函数参数转换为不可变的字段(值), val关键字是可选的,如果要使用可变字段,请使用var关键字。

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

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

参考链接

www.learnfk.com/scala/scala…