Kotlin 中的Receiver 是什么

Kotlin官方文檔中沒有針對Receiver的專題講解沟于,但這個知識點卻貫穿在了整個基礎(chǔ)體系中

Receiver

字面意思是接收者,為什么kotlin會有這個概念?首先kotlin中函數(shù)是一等公民,和java不一樣,java中的函數(shù)(準(zhǔn)確來說是方法)需要依賴于類唧领,kotlin的函數(shù)不依賴類,它可以在任何地方定義雌续,那么在某些場景就會有一些問題

場景1.

開發(fā)者想知道函數(shù)調(diào)用者上下文斩个,看下面代碼


1594974078(1).png

如果函數(shù)有Receiver,那么this 就是對應(yīng)的Receiver,如果不寫Receiver 驯杜,那么this 表示什么受啥?


1594974621(1).png

看到?jīng)],沒寫的話鸽心,默認(rèn)是這個函數(shù)所定義的類里面滚局,那如果我們lambda表達(dá)式里嵌套lambda表達(dá)式,最里層的上下文是哪個呢
1594975059(1).png

與第一層的上下文一致
到這里顽频,我們可以總結(jié)下:
1.函數(shù)默認(rèn)Receiver是該函數(shù)所定義的類內(nèi)(感覺有點廢話)
2.函數(shù)內(nèi)this指向的是Receiver


1595382612(1).png

我這里為什么要講:1.函數(shù)默認(rèn)Receiver是該函數(shù)所定義的類內(nèi) 藤肢。這句廢話,其實是有原因的糯景,
這和kotlin lanbda 表達(dá)式原理有關(guān),具體的可以參看kotlin入門潛修之進(jìn)階篇—高階方法和lambda表達(dá)式原理;kotlin會為lambda表達(dá)式生成一個新類嘁圈,類名為自己所處的類名(Test)+ 所處的方法名(test)+ 數(shù)字(從1開始省骂,有多個則依次遞增)。該類繼承了Lambda類并實現(xiàn)了對應(yīng)的Function接口最住,那按照這個原理钞澳,那么lambda表達(dá)式內(nèi)的this指向的就是編譯器為lambda生成的新類,這與我上面的兩點總結(jié)不符合涨缚,但是上面兩點總結(jié)是根據(jù)事實而來轧粟,這說明在JVM層面,肯定對這種情況作了處理仗岖,至于怎么處理的逃延,我也沒有找到具體的依據(jù)览妖。如果讀者有好的見解還望評論分享下
我這里從Java與kotlin之間的聯(lián)系來解讀下為什么JVM會做這種轉(zhuǎn)換處理以及為什么需要Receiver這個概念
我們知道Java中我們通常說的函數(shù)其實是不準(zhǔn)確的轧拄,應(yīng)該稱為方法,Java中的方法需依賴于類讽膏,java中的this指向的是調(diào)用者本身檩电。因為kotlin(本文討論的kotlin是基于java)是基于Java之上的封裝,所以對于開發(fā)者而言府树,this 不管是在kotlin 還是在java中 概念都應(yīng)該保持統(tǒng)一俐末,即代表上下文,或者說this指向的都是調(diào)用這本身奄侠,但是kotlin 中的函數(shù)是有自己的類型卓箫,或者說它可以自己調(diào)用自己,不需要依賴類垄潮,這樣就會存在一些問題烹卒,那怎樣將kotlin中的this翻譯成Java中的this呢,在轉(zhuǎn)換的時候怎么處理弯洗,這時候就借用了Receiver這個概念了旅急,kotlin可以默認(rèn)或者指定某個函數(shù)的Receiver,這樣類似于對這個函數(shù)做了一份主權(quán)申明:“這個函數(shù)是定義在我這個類的”牡整。這樣做的好處就是在轉(zhuǎn)換成Java語言時可以根據(jù)Receiver來明確上下文this.我們可以在kotlin 字節(jié)碼中找的到了$Receicer 這個常量藐吮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逃贝,隨后出現(xiàn)的幾起案子谣辞,更是在濱河造成了極大的恐慌,老刑警劉巖沐扳,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泥从,死亡現(xiàn)場離奇詭異,居然都是意外死亡迫皱,警方通過查閱死者的電腦和手機(jī)歉闰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門辖众,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人和敬,你說我怎么就攤上這事凹炸。” “怎么了昼弟?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵啤它,是天一觀的道長。 經(jīng)常有香客問我舱痘,道長变骡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任芭逝,我火速辦了婚禮塌碌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旬盯。我一直安慰自己台妆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布胖翰。 她就那樣靜靜地躺著接剩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萨咳。 梳的紋絲不亂的頭發(fā)上懊缺,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音培他,去河邊找鬼鹃两。 笑死,一個胖子當(dāng)著我的面吹牛靶壮,可吹牛的內(nèi)容都是我干的怔毛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼腾降,長吁一口氣:“原來是場噩夢啊……” “哼拣度!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螃壤,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤抗果,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奸晴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冤馏,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年寄啼,在試婚紗的時候發(fā)現(xiàn)自己被綠了逮光。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代箭。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涕刚,靈堂內(nèi)的尸體忽然破棺而出嗡综,到底是詐尸還是另有隱情,我是刑警寧澤杜漠,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布极景,位于F島的核電站,受9級特大地震影響驾茴,放射性物質(zhì)發(fā)生泄漏盼樟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一锈至、第九天 我趴在偏房一處隱蔽的房頂上張望晨缴。 院中可真熱鬧,春花似錦裹赴、人聲如沸喜庞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雷猪,卻和暖如春睛竣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背求摇。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工射沟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人与境。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓验夯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親摔刁。 傳聞我的和親對象是個殘疾皇子挥转,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354