真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

scala的模式匹配是什么

scala的模式匹配是什么?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計,新干網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:新干等地區(qū)。新干做網(wǎng)站價格咨詢:18982081108

一. scala 模式匹配(pattern matching)

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

scala 的 pattern matching 是類似這樣的,

e match {
  case Pattern1 => do Something
  case Pattern2 if-clause => do others
  ...
}

其中,變量 e 后面接一個 match 以及一個代碼塊,其中每個 case 對應(yīng)一種可能回匹配的類型,如果匹配成功則執(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 則要強(qiáng)大得多,除了可以匹配數(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 呢?

首先我們需要明白,模式匹配其實本質(zhì)上是提供一個方便的解構(gòu) (Destructuring) 數(shù)據(jù)結(jié)構(gòu)的方式,以 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")
  }

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

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

  val user: User = new FreeUser("Daniel")
  //將返回結(jié)果存在一個常量中
  val message = user match {
    case FreeUser(name) => "it match here" + name
    case _ => "not me"
  }
  //可以隨意使用該常量,實現(xiàn)解耦
  println(message)

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

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

感謝各位的閱讀!看完上述內(nèi)容,你們對scala的模式匹配是什么大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)站名稱:scala的模式匹配是什么
轉(zhuǎn)載注明:http://weahome.cn/article/gsdjeo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部