最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談Scala模式匹配

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

一.scala模式匹配(pattern matching)

pattern matching可以說是scala中十分強大的一個語言特性,當(dāng)然這不是scala獨有的,但這不妨礙它成為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則要強大得多,除了可以匹配數(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的話,代碼會簡潔清晰很多,而簡潔的代碼則會更容易閱讀。

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

相關(guān)文章

  • Eclipse 誤刪文件的恢復(fù)與代碼的恢復(fù)詳解

    Eclipse 誤刪文件的恢復(fù)與代碼的恢復(fù)詳解

    這篇文章主要介紹了Eclipse 誤刪文件的恢復(fù),代碼的恢復(fù)的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號

    chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號

    這篇文章主要介紹了chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號,這個版本重點提升了常用工具的使用效率,需要的朋友可以參考下
    2021-03-03
  • 單點登錄的三種實現(xiàn)方式

    單點登錄的三種實現(xiàn)方式

    這篇文章主要介紹了單點登錄的三種實現(xiàn)方式,幫助大家建立網(wǎng)站,優(yōu)化網(wǎng)站體驗,感興趣的朋友可以了解下
    2020-09-09
  • Sqoop的安裝與使用詳細(xì)教程

    Sqoop的安裝與使用詳細(xì)教程

    Sqoop是一款開源的工具,主要用于在Hadoop與傳統(tǒng)數(shù)據(jù)庫間進(jìn)行數(shù)據(jù)的傳遞,這篇文章主要介紹了Sqoop的安裝與使用詳細(xì)教程,需要的朋友可以參考下
    2021-04-04
  • Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全(完整)

    Windows API函數(shù)大全,從事軟件開發(fā)的朋友可以參考下
    2012-05-05
  • 漫談架構(gòu)之微服務(wù)

    漫談架構(gòu)之微服務(wù)

    微服務(wù)的架構(gòu)出現(xiàn)已經(jīng)很久很久了,微服務(wù)架構(gòu)就是一種將單個應(yīng)用程序轉(zhuǎn)換為一組小服務(wù)的方法,每個小服務(wù)都在自己的進(jìn)程中運行,并使用輕量級的交互方式(如HTTP)進(jìn)行通信
    2021-06-06
  • IntelliJ IDEA插件EasyCode安裝方法與使用技巧

    IntelliJ IDEA插件EasyCode安裝方法與使用技巧

    這篇文章主要介紹了IntelliJ IDEA插件EasyCode安裝方法與使用技巧,需要的朋友可以參考下
    2020-03-03
  • YOLO v4常見的非線性激活函數(shù)詳解

    YOLO v4常見的非線性激活函數(shù)詳解

    這篇文章主要介紹了YOLO v4常見的非線性激活函數(shù),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • 在VScode上使用latex編輯pdf的方法

    在VScode上使用latex編輯pdf的方法

    這篇文章主要介紹了在VScode上使用latex編輯pdf的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 好玩又實用的查看函數(shù)圖像網(wǎng)站Desmos

    好玩又實用的查看函數(shù)圖像網(wǎng)站Desmos

    這個網(wǎng)站的最大優(yōu)點,就是省去了安裝數(shù)學(xué)繪圖軟件或計算軟件的麻煩,只要打開瀏覽器就能使用了??戳私榻B之后,可別忘了把這個好網(wǎng)站加到書簽
    2021-08-08

最新評論

稻城县| 南澳县| 临漳县| 公主岭市| 南澳县| 奉贤区| 错那县| 双江| 崇左市| 柞水县| 山阴县| 剑河县| 泰安市| 岳池县| 长白| 阿城市| 舒城县| 喀喇沁旗| 乡宁县| 上饶市| 漳州市| 咸宁市| 信宜市| 屯留县| 石狮市| 嘉祥县| 当雄县| 牙克石市| 白玉县| 新宁县| 绥中县| 城口县| 盘山县| 蒙城县| 玛沁县| 安顺市| 泾阳县| 余江县| 云阳县| 玛曲县| 逊克县|