欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Scala模式匹配

 更新時(shí)間:2020年06月29日 11:04:20   作者:zzzzMing  
這篇文章主要介紹了Scala模式匹配的的相關(guān)資料,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

一.scala模式匹配(pattern matching)

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

scala的pattern matching是類似這樣的,

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

其中,變量e后面接一個(gè)match以及一個(gè)代碼塊,其中每個(gè)case對(duì)應(yīng)一種可能回匹配的類型,如果匹配成功則執(zhí)行=>后面的代碼。

我們可以用一個(gè)具體一些的例子來(lái)看看模式匹配是怎么工作的:

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!")
}

看起來(lái)有點(diǎn)類似于其他語(yǔ)言的switch,但其實(shí)還是有很大的不同的。

以java的switch為例,java的switch僅僅會(huì)做一些基本類型的匹配,然后執(zhí)行一些動(dòng)作,并且是沒有返回值的。

而scala的pattern matching match則要強(qiáng)大得多,除了可以匹配數(shù)值,同時(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
}

同時(shí)pattern matching是有返回值的,比如上面的match,它返回的就是一個(gè)Unit。我們也可以修改上面的代碼讓它返回一個(gè)字符串:

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 返回值是由第一個(gè)匹配的模式中的代碼塊決定的。

二. 為什么要用pattern matching

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

首先我們需要明白,模式匹配其實(shí)本質(zhì)上是提供一個(gè)方便的解構(gòu)(Destructuring)數(shù)據(jù)結(jié)構(gòu)的方式,以scala為例,pattern matching其實(shí)用到了scala中提取器的功能,提取器其實(shí)就是類中的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ì)你就會(huì)直到,其實(shí)if else只是pattern matching中的一個(gè)典型的用法,但并非它的全部。

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

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

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

而以可讀性的角度來(lái)說,使用一大堆的if else代碼無(wú)疑是比較難看的,而如果使用pattern matching的話,代碼會(huì)簡(jiǎn)潔清晰很多,而簡(jiǎn)潔的代碼則會(huì)更容易閱讀。

以上就是淺談Scala模式匹配的詳細(xì)內(nèi)容,更多關(guān)于scala模式匹配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • App開發(fā)建議技巧

    App開發(fā)建議技巧

    有同學(xué)問我,對(duì)應(yīng)用開發(fā)你有沒有值得注意或小技巧的地方可以分享的。比如適配、優(yōu)化、排查錯(cuò)誤什么的。雞排把自己的總結(jié)筆記整理出來(lái)了。供大家參考
    2018-01-01
  • 笛卡爾乘積介紹

    笛卡爾乘積介紹

    笛卡爾(Descartes)乘積又叫直積。假設(shè)集合A={a,b},集合B={0,1,2},則兩個(gè)集合的笛卡爾積為{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}
    2013-05-05
  • 分享5個(gè)實(shí)用的vs調(diào)試技巧

    分享5個(gè)實(shí)用的vs調(diào)試技巧

    vs 是我們平時(shí)編寫代碼時(shí)的首選工具,相信也是大多數(shù)小伙伴兒的首選調(diào)試工具,因?yàn)閷?shí)際操作起來(lái)太方便了,代碼編寫完,一個(gè) F5 就可以愉快的調(diào)試了。今天我想向大家推薦幾個(gè)非常值得了解 vs 調(diào)試技巧。
    2020-09-09
  • 趣味函數(shù)式編程圣經(jīng)

    趣味函數(shù)式編程圣經(jīng)

    這篇文章主要介紹了函數(shù)式編程的的相關(guān)資料,有趣的講解了函數(shù)式編程的相關(guān)知識(shí),幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • app開發(fā)之原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別

    app開發(fā)之原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別

    這篇文章主要介紹了app開發(fā)之原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別,需要的朋友可以參考下
    2019-12-12
  • 詳解Maven命令大全

    詳解Maven命令大全

    Maven是一個(gè)項(xiàng)目管理工具,它包含了一個(gè)項(xiàng)目對(duì)象模型 (Project Object Model),這篇文章主要介紹了maven命令大全,需要的朋友可以參考下
    2020-07-07
  • vscode配置備份的操作代碼

    vscode配置備份的操作代碼

    這篇文章主要介紹了vscode配置備份的相關(guān)知識(shí),本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 計(jì)算機(jī)網(wǎng)絡(luò)編程MQTT協(xié)議基礎(chǔ)原理詳解

    計(jì)算機(jī)網(wǎng)絡(luò)編程MQTT協(xié)議基礎(chǔ)原理詳解

    這篇文章主要為大家介紹了計(jì)算機(jī)編程MQTT協(xié)議的基礎(chǔ)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2021-11-11
  • 詳解提升場(chǎng)景文本識(shí)別中的語(yǔ)言模型

    詳解提升場(chǎng)景文本識(shí)別中的語(yǔ)言模型

    語(yǔ)言模型即根據(jù)當(dāng)前語(yǔ)境的上下文推斷當(dāng)前句子的意思。文本圖像中包含兩層信息:視覺紋理信息和語(yǔ)言信息。由于單純根據(jù)視覺紋理信息進(jìn)行文字識(shí)別缺少了對(duì)上下文的字符語(yǔ)義信息的挖掘,時(shí)常會(huì)導(dǎo)致錯(cuò)誤的文本識(shí)別結(jié)果(之后會(huì)詳細(xì)說明)。
    2021-05-05
  • java與c#的區(qū)別、兩者有什么不同?

    java與c#的區(qū)別、兩者有什么不同?

    Java和C#都是一門面向?qū)ο蟮恼Z(yǔ)言,Java更多地借鑒了C++的優(yōu)點(diǎn),而摒棄了它的一些不太容易被人掌握的知識(shí)點(diǎn)(有些不能說是缺點(diǎn)),并且增加了一些自己的特點(diǎn),而C#則是更多地借鑒了Java的優(yōu)點(diǎn),而增加了一些自己的特點(diǎn)
    2013-04-04

最新評(píng)論