淺談Scala模式匹配
一.scala模式匹配(pattern matching)
pattern matching可以說是scala中十分強(qiáng)大的一個(gè)語言特性,當(dāng)然這不是scala獨(dú)有的,但這不妨礙它成為scala的語言的一大利器。
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è)具體一些的例子來看看模式匹配是怎么工作的:
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!")
}
看起來有點(diǎn)類似于其他語言的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)一步操作。
而以可讀性的角度來說,使用一大堆的if else代碼無疑是比較難看的,而如果使用pattern matching的話,代碼會(huì)簡(jiǎn)潔清晰很多,而簡(jiǎn)潔的代碼則會(huì)更容易閱讀。
以上就是淺談Scala模式匹配的詳細(xì)內(nèi)容,更多關(guān)于scala模式匹配的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Eclipse 誤刪文件的恢復(fù)與代碼的恢復(fù)詳解
這篇文章主要介紹了Eclipse 誤刪文件的恢復(fù),代碼的恢復(fù)的相關(guān)資料,需要的朋友可以參考下2016-09-09
chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號(hào)
這篇文章主要介紹了chrome開發(fā)者助手插件v2.10發(fā)布提升開發(fā)效率不再只是口號(hào),這個(gè)版本重點(diǎn)提升了常用工具的使用效率,需要的朋友可以參考下2021-03-03
IntelliJ IDEA插件EasyCode安裝方法與使用技巧
這篇文章主要介紹了IntelliJ IDEA插件EasyCode安裝方法與使用技巧,需要的朋友可以參考下2020-03-03
好玩又實(shí)用的查看函數(shù)圖像網(wǎng)站Desmos
這個(gè)網(wǎng)站的最大優(yōu)點(diǎn),就是省去了安裝數(shù)學(xué)繪圖軟件或計(jì)算軟件的麻煩,只要打開瀏覽器就能使用了??戳私榻B之后,可別忘了把這個(gè)好網(wǎng)站加到書簽2021-08-08

