溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala的模式匹配是什么

發(fā)布時間:2020-10-20 15:49:44 來源:億速云 閱讀:259 作者:小新 欄目:編程語言

scala的模式匹配是什么?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純热?,讓我們一起來看看吧?/p>

一. 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 對應一種可能回匹配的類型,如果匹配成功則執(zhí)行 => 后面的代碼。

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

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 僅僅會做一些基本類型的匹配,然后執(zhí)行一些動作,并且是沒有返回值的。

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

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

看到這里你會發(fā)現(xiàn)一個問題, pattern matching 不是和if else 差不多嗎?那為什么還要使用 pattern matching 呢?

首先我們需要明白,模式匹配其實本質上是提供一個方便的解構 (Destructuring) 數(shù)據結構的方式,以 scala 為例, pattern matching 其實用到了 scala 中提取器的功能, 提取器其實就是類中的 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"
  }
  //可以隨意使用該常量,實現(xiàn)解耦
  println(message)

這樣會賦予代碼更多的靈活性,同時也更加方便做進一步操作。

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

感謝各位的閱讀!看完上述內容,你們對scala的模式匹配是什么大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI