快學(xué)Scala第11章----操作符

本章要點(diǎn)

  • 標(biāo)識(shí)符由字母揖庄、數(shù)字或運(yùn)算符構(gòu)成。
  • 一元和二元操作符其實(shí)是方法調(diào)用
  • 操作符優(yōu)先級(jí)取決于第一個(gè)字符媳纬,而結(jié)合性取決于最后一個(gè)字符
  • apply 和 update方法在對(duì)expr(args)表達(dá)式求值時(shí)被調(diào)用。
  • 提取器從輸入中提取元組或值的序列。

標(biāo)識(shí)符

變量钦听、函數(shù)洒试、類(lèi)等名稱(chēng)統(tǒng)一稱(chēng)為標(biāo)識(shí)符;雖然在Scala中有更多的選擇朴上,可以由字母垒棋、數(shù)字和各種運(yùn)算符構(gòu)成,但是如果語(yǔ)義不夠明確痪宰,還是不要隨意使用(個(gè)人覺(jué)得還是使用C++或Java的規(guī)定:標(biāo)識(shí)符由字母叼架、數(shù)字和下劃線(xiàn)構(gòu)成,數(shù)字不能作為開(kāi)始衣撬,這樣會(huì)比較統(tǒng)一碉碉,也沒(méi)有莫名的語(yǔ)義),例如你的標(biāo)識(shí)符為:淮韭!#%&* 雖然沒(méi)有語(yǔ)法錯(cuò)誤垢粮,但是很難理解它代表了什么。

** 注意:** 反引號(hào)有比較特質(zhì)的用途靠粪,例如:

val 'val' = 42   // 這樣就可以使用Scala的關(guān)鍵字了蜡吧,但是盡量不要這么使用
// 特殊的使用情況,Java的Thread中有yield方法占键,而Scala中yield是保留字:
Thread.'yield'()   //使用反引號(hào)

中置操作符

中置操作符是二元的昔善,它有兩個(gè)參數(shù)

a 標(biāo)識(shí)符 b
// 例如
1 to 10
//實(shí)際上是
1.to(10)

你也可以重定義和重載操作符,這和C++或Java是一樣的畔乙。


一元操作符

一元操作符只有一個(gè)參數(shù)君仆。

a 標(biāo)識(shí)符
// 例如
1 toString
// 實(shí)際上是
1.toString()

賦值操作符

a 操作符= b
// 等同于
a = a 操作符 b
// 例如 
a += b

技術(shù)細(xì)節(jié):

  • <= 、 >=和 != 是判斷標(biāo)識(shí)符牲距,不是賦值操作符
  • 以=開(kāi)頭的操作符不是賦值操作符返咱,(==, ===, =/=)
  • 如果a重寫(xiě)了名為=的操作符牍鞠,該方法會(huì)被直接調(diào)用

優(yōu)先級(jí)

Scala的中操作符優(yōu)先級(jí)和C++咖摹、Java中的一樣,不過(guò)它是由操作符的首字符決定的难述。

* / %  ---> + -  ---> : ---> < > ---> != ---> & ---> ^ ---> | ---> 非操作符 ---> 賦值操作符

結(jié)合性

在Scala中萤晴,所有操作符都是左結(jié)合的,出了:

  • 以冒號(hào)(:)結(jié)尾的操作符
  • 賦值操作符
    例如:
1 :: 2 :: Nil   // 這是右結(jié)合的
1 :: (2 :: Nil)  // 等同于

apply 和 update 方法

Scala允許你將如下的函數(shù)調(diào)用方法:

 f(arg1, arg2, ...)
// 如果f不是函數(shù)胁后,這個(gè)表達(dá)式就等同于:
f.apply(arg1, arg2, ...)

f(arg1, arg2, ...) = value
f.update(arg1, arg2, ..., value)  //等同于
···
這在前面的map映射時(shí)已經(jīng)提到過(guò)店读。
``` scala
val scores = new scala.collection.mutable.HashMap[String, Int]
scores("Bob") = 100  // 調(diào)用了scores.update("Bob", 100)
val bobsScore = scores("Bob")  // 調(diào)用了scores.apply("Bob")

在前面的伴生對(duì)象中,apply方法用來(lái)構(gòu)造對(duì)象而不用顯示的使用new攀芯。這在比較復(fù)雜的表達(dá)式中比較有用:

class Fraction(n: Int, d: Int) {
  ...
}

object Fraction {
  def apply(n: Int, d: Int) = new Fraction(n, d)
}

val  result = Fraction(3, 4) * Fraction(2, 5)  //省去了new

提取器

提取其就是一個(gè)帶unapply方法的對(duì)象屯断,它和伴生對(duì)象的apply方法正好相反。apply接受構(gòu)造參數(shù),然后將它們構(gòu)造成對(duì)象裹纳;而unapply方法接受一個(gè)對(duì)象,然后從中取值---通常這些值就是當(dāng)初用來(lái)構(gòu)造該對(duì)象的值紧武。

object Fraction {
  def apply(n: Int, d: Int) = new Fraction(n, d)

  def unapply(input: Fraction) = {
    if (input.den == 0) None else Some((input.num, input.den))
  }
}

var Fraction(a, b) = Fraction(3, 4) * Fraction(2, 5)  // a 被初始化成3*2剃氧, b被初始化成 4*5

你可以用提取器從任何類(lèi)型的對(duì)中提取信息:

// Name對(duì)象是針對(duì)String對(duì)象的一個(gè)提取器,所有不需要Name 類(lèi)
object Name {
  def unapply(input: String) = {
    val pos = input.indexOf(" ")
    if (pos == -1) None
    else Some((input.substring(0, pos), input.substring(pos + 1)))
  }
}

val  author = "Cay Horstmann"
val Name(first, last) = author

帶單個(gè)參數(shù)或無(wú)參數(shù)的提取器

在Scala中阻星,并沒(méi)有只帶一個(gè)組件的元組朋鞍,如果unapply方法要提取單值,則它應(yīng)該返回一個(gè)目標(biāo)類(lèi)型的Option :

object Number {
  def unapply(input: String): Option[Int] = {
    try {
      Some(Integer.parseInt(input.trim))
    } catch {
      case ex: NumberFormatException => None
    }
  }
}

val Number(n) = "1729"

無(wú)參數(shù)的提取器:只是測(cè)試其輸入而不真的提取出來(lái)妥箕,這樣unapply方法返回Boolean

object IsCompound {
  def unapply(input: String) = input.contains(" ")
}

// 用該提取器給模式增加一個(gè)測(cè)試:
author match {
  case Name(first, last @ IsCompound()) => ...
  case Name(first, last) => ...
}

unapplySeq方法

要提前任意長(zhǎng)度的值的序列滥酥,應(yīng)該使用unapplySeq方法:

object Name {
  def unapplySeq(input: String): Option[Seq[String]] = {
    if (input.trim == "") None
    else Some(input.trim.split("\\s+"))
  }
}

// 這樣可以匹配任意數(shù)量的變量
author math {
  case Name(first, last) => ...
  case Name(first, middle, last) => ...
  case Name(first, "van", "der", last) => ...
  ...
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市畦幢,隨后出現(xiàn)的幾起案子坎吻,更是在濱河造成了極大的恐慌,老刑警劉巖宇葱,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘦真,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡黍瞧,警方通過(guò)查閱死者的電腦和手機(jī)诸尽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)印颤,“玉大人您机,你說(shuō)我怎么就攤上這事∧昃郑” “怎么了际看?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矢否。 經(jīng)常有香客問(wèn)我仿村,道長(zhǎng),這世上最難降的妖魔是什么兴喂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任蔼囊,我火速辦了婚禮,結(jié)果婚禮上衣迷,老公的妹妹穿的比我還像新娘畏鼓。我一直安慰自己,他們只是感情好壶谒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布云矫。 她就那樣靜靜地躺著,像睡著了一般汗菜。 火紅的嫁衣襯著肌膚如雪让禀。 梳的紋絲不亂的頭發(fā)上挑社,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音巡揍,去河邊找鬼痛阻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腮敌,可吹牛的內(nèi)容都是我干的阱当。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糜工,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弊添!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起捌木,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤油坝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刨裆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體免钻,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年崔拥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了极舔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡链瓦,死狀恐怖拆魏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情慈俯,我是刑警寧澤渤刃,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站贴膘,受9級(jí)特大地震影響卖子,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刑峡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一洋闽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧突梦,春花似錦诫舅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春虚汛,著一層夾襖步出監(jiān)牢的瞬間匾浪,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工卷哩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛋辈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓殉疼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親捌年。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓢娜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,934評(píng)論 6 13
  • 讀《快學(xué)Scala 》一書(shū)的摘要 Scala 運(yùn)行于JVM之上,擁有海量類(lèi)庫(kù)和工具礼预,兼顧函數(shù)式編程和面向?qū)ο蟆?在...
    abel_cao閱讀 1,278評(píng)論 0 8
  • //Clojure入門(mén)教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,634評(píng)論 0 7
  • 第二天天剛剛亮眠砾,就有兩只喜鵲在窩前唧唧咋咋個(gè)不停。本想睡個(gè)早覺(jué)的車(chē)振被吵醒了托酸,用枕頭蒙著頭也不行褒颈,干脆起來(lái),去健身...
    半痞閱讀 273評(píng)論 1 2
  • 文/水靈兒 她叫小思励堡,一個(gè)美麗善良又有才華的女子谷丸。她怎么也不會(huì)想到,癌癥应结,這個(gè)魔鬼在她毫無(wú)防備的情況下刨疼,竟悄無(wú)聲息...
    Rrl水靈兒閱讀 1,419評(píng)論 0 2