淺談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對應(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)
這樣會賦予代碼更多的靈活性,同時也更加方便做進一步操作。
而以可讀性的角度來說,使用一大堆的if else代碼無疑是比較難看的,而如果使用pattern matching的話,代碼會簡潔清晰很多,而簡潔的代碼則會更容易閱讀。
以上就是淺談Scala模式匹配的詳細內(nèi)容,更多關(guān)于scala模式匹配的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
app開發(fā)之原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別
這篇文章主要介紹了app開發(fā)之原生開發(fā)、H5開發(fā)和混合開發(fā)的區(qū)別,需要的朋友可以參考下2019-12-12計算機網(wǎng)絡(luò)編程MQTT協(xié)議基礎(chǔ)原理詳解
這篇文章主要為大家介紹了計算機編程MQTT協(xié)議的基礎(chǔ)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11