首頁 > Java > java教程 > 主體

淺談scala的模式匹配

不言
發布: 2018-11-16 15:40:39
轉載
2131 人瀏覽過

這篇文章帶給大家的內容是關於淺談scala的模式匹配,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

一.scala 模式匹配(pattern matching)

pattern matching 可以說是scala 中十分強大的一個語言特性,當然這不是scala 獨有的,但這不妨礙它成為scala的語言的一大利器。

scala 的pattern matching 是類似這樣的,

e match {
  case Pattern1 => do Something
  case Pattern2 if-clause => do others
  ...
}
登入後複製

其中,變數e 後面接一個match 以及一個程式碼區塊,其中每個case 對應一種可能回匹配的類型,如果匹配成功則執行=> 後面的程式碼。

我們可以用一個具體一些的例子來看看模式匹配是怎麼工作的:

case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {
  case Player(_, score) if score > 100000 =>
    println("Get a job, dude!")
  case Player(name, _) =>
    println("Hey, $name, nice to see you again!")
}
登入後複製

看起來有點類似於其他語言的switch,但其實還是有很大的不同的。

以java 的 switch 為例,java 的 switch 只會做一些基本類型的匹配,然後執行一些動作,並且是沒有回傳值的。

而 scala 的 pattern matching match 則要強大得多,除了可以匹配數值,同時它還能匹配類型。

def parseArgument(arg: String) = arg match {
    //匹配值
    case "-h" | "--help" => displayHelp
    case "-v" | "--version" => displayVerion
    case whatever => unknownArgument(whatever)
}
登入後複製
def f(x: Any): String = x match {
    //匹配类型
    case i:Int => "integer: " + i
    case _:Double => "a double"
    case s:String => "I want to say " + s
}
登入後複製

同時 pattern matching 是有回傳值的,例如上面的 match ,它回傳的就是一個 Unit。我們也可以修改上面的程式碼讓它回傳一個字串:

case class Player(name: String, score: Int)
def message(player: Player) = player match {
  case Player(_, score) if score > 100000 =>
    "Get a job, dude!"
  case Player(name, _) =>
    "Hey, $name, nice to see you again!"
}
登入後複製

值得一提的是, pattern matching 回傳值是由第一個符合的模式中的程式碼區塊決定的。

二. 為什麼要用 pattern matching

看到這裡你會發現一個問題, pattern matching 不是跟if else 差不多嗎?那為什麼還要使用 pattern matching 呢?

首先我們需要明白,模式匹配其實本質上是提供一個方便的解構(Destructuring) 資料結構的方式,以scala 為例, pattern matching 其實就是類別中的unapply () 方法。

trait User {
  def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
  //提取器
  def unapply(user: FreeUser): Option[String] = Some(user.name)
}
登入後複製
  val user: User = new FreeUser("Daniel")
  user match {
    case FreeUser(name) => println("it match here" + name)
    case _ => println("not me")
  }
登入後複製

明白了模式匹配的本質你就會直到,其實 if else 只是 pattern matching 中的一個典型的用法,但並非它的全部。

同時, pattern matching 允許你解耦兩個不真正屬於彼此的東西,也使得你的程式碼更容易測試。例如上面的 match 部分的程式碼我們可以寫成下面這樣:

  val user: User = new FreeUser("Daniel")
  //将返回结果存在一个常量中
  val message = user match {
    case FreeUser(name) => "it match here" + name
    case _ => "not me"
  }
  //可以随意使用该常量,实现解耦
  println(message)
登入後複製

這樣會賦予程式碼更多的彈性,同時也更方便做進一步操作。

而以可讀性的角度來說,使用一大堆的if else 程式碼無疑是比較難看的,而如果使用pattern matching 的話,程式碼會簡潔清晰很多,而簡潔的程式碼則會更容易閱讀。

#

以上是淺談scala的模式匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板