Scala中的match, 比起以往使用的switch-case有著更強大的功能,

1. 傳統方法

  1. def toYesOrNo(choice: Int): String = choice match {
  2. case 1 => "yes"
  3. case 0 => "no"
  4. case _ => "error"
  5. }
  6.  
  7. // toYesOrNo(1)=>"yes"
  8. // toYesOrNo(0)=>"no"
  9. // toYesOrNo(33)=>"error"
  1.  

佔位符“_”表示預設的情形, 若不想使用"_"也可以寫成以下的形式,

  1. def toYesOrNo(choice: Int): String = choice match {
  2. case 1 => "yes"
  3. case 0 => "no"
  4. case whaterver => "whaterver "
  5. }
  1.  
  1. 2. 類型模式
  1.  
  1. 可以使用保留字match來判斷類型
  1. def f(x: Any): String = x match {
  2. case i:Int => "integer: " + i
  3. case _:Double => "a double"
  4. case s:String => "I want to say " + s
  5. }
  6.  
  7. // f(1) → “integer: 1″Typ
  8. // f(1.0) → “a double”
  9. // f(“hello”) → “I want to say hello”

3. Functional approach to pattern matching

以下是一個Factorial的傳統遞迴方法

  1. def fact(n: Int): Int =
  2. if (n == 0) 1
  3. else n * fact(n - 1)

改以pattern matching來實現, 又會如何呢??

  1. def fact(n: Int): Int = n match {
  2. case 0 => 1
  3. case n => n * fact(n - 1)
  4. }

4. 模式匹配與集合

來試試一個集合加總的遞迴實現, 我們可能會寫出以下的代碼

  1. def length[A](list : List[A]) : Int = {
  2. if (list.isEmpty) 0
  3. else 1 + length(list.tail)
  4. }

看起來沒什麼問題, 但在pattern matching下有更酷的寫法,

  1. def length[A](list : List[A]) : Int = list match {
  2. case _ :: tail => 1 + length(tail)
  3. case Nil => 0
  4. }

"Nil"代表集合為空時,

"_::tailX" 應該被理解成, “a list with whatever head followed by a tail.”我的解釋是能將一個list拆分為list.head與list.tail

接著我們可以來看看多個參數的pattern matching要怎麼做呢??

  1. def parseArgument(arg : String, value: Any) = (arg, value) match {
  2. case ("-l", lang) => setLanguageTo(lang)
  3. case ("-o" | "--optim", n : Int) if ((0 < n) && (n <= 5)) => setOptimizationLevelTo(n)
  4. case ("-o" | "--optim", badLevel) => badOptimizationLevel(badLevel)
  5. case ("-h" | "--help", null) => displayHelp()
  6. case bad => badArgument(bad)
  7. }

在pattern中還有最重要的case class, 下一篇繼續介紹....

參考資料:

Playing with Scala’s pattern matching

A Tour of Scala: Case Classes

[Scala] Pattern Matching(模式匹配)的更多相关文章

  1. scala pattern matching

    scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...

  2. learning scala pattern matching 02

    code package com.aura.scala.day01 object patternMatching02 { def main(args: Array[String]): Unit = { ...

  3. learning scala pattern matching

    code: package com.aura.scala.day01 import scala.util.Random object patternMatching01 { def main(args ...

  4. learning scala pattern matching 03

    code: package com.aura.scala.day01 object patternMatching03 { //当不同类型对象需要调用不同方法时,仅匹配类型的模式非常有用. def g ...

  5. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  6. C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...

  7. Symbols of String Pattern Matching

    Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...

  8. Zhu-Takaoka Two-dimensional Pattern Matching

    Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...

  9. 第74讲:从Spark源码的角度思考Scala中的模式匹配

    今天跟随王老师学习了从源码角度去分析scala中的模式匹配的功能.让我们看看源码中的这一段模式匹配: 从代码中我们可以看到,case RegisterWorker(id,workerHost,.... ...

随机推荐

  1. Ubuntu配置ip和dns后还是不能访问外网

    https://blog.csdn.net/WFping518/article/details/81011722

  2. Xshell显示本地数据排版错乱

    解决办法 文件 - 属性 - 终端 - 高级 - 用CR-LF接受LF(R)

  3. OO 抽象类与接口的区别

    抽象类与接口的区别 抽象类与接口的区别 一.抽象类:(抽象类适用于同一系列,并且有需要继承的成员) 概念: 1.使用abstract修饰: 2.抽象类中可以包含抽象方法: 3.抽象类只能被子类继承:( ...

  4. 20165219 2017-2018-2 《Java程序设计》第6周学习总结

    20165219 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容小结 第八章 String类 常用方法 public int length() 求字符串长度 pu ...

  5. ClickOnce发布包含某文件

    第一步.在文件上右键选择“属性”,“复制到输出目录”选择“始终复制”: 第二步.“生成操作”选择“选择”: 第三步.通过 项目右键属性-发布-应用程序文件 查看想要包含的文件是否包含进来了. 注:可以 ...

  6. 【noip2017】【Luogu3960】列队 线段树

    题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n \times mn×m 名学生,方阵的 ...

  7. CentOS71611安装Python3.5.3

    yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc wget wg ...

  8. 《Andrew Ng深度学习》笔记1

    深度学习概论 1.什么是神经网络? 2.用神经网络来监督学习 3.为什么神经网络会火起来? 1.什么是神经网络? 深度学习指的是训练神经网络.通俗的话,就是通过对数据的分析与计算发现自变量与因变量的映 ...

  9. 高版本sketch文件转成低版本的sketch

    https://pan.baidu.com/s/1htmNERU 下载 该文件然后在放到高版本sketch文件的目录下,执行下面命令 chmod +x ./build.sh ./build.sh 文件 ...

  10. XAF对Attribute的总结

    [Aggregated] 没有参数,作用于a property or a field,并且只能是持久类的引用或者XPCollection.实现两个持久类的级联删除的功能. [Association(& ...