kotlin中磷账,let、run贾虽、with逃糟、apply、also這幾個標(biāo)準(zhǔn)函數(shù)使用起來非常方便榄鉴,合理使用可以很大程度上的簡化代碼履磨,但是這幾個標(biāo)準(zhǔn)函數(shù)用法和功能相似,初學(xué)kotlin時庆尘,很容易會不知道該選哪一個剃诅,其實(shí)看下源碼并熟悉kotlin的高階函數(shù)就很容易理解了。這幾個標(biāo)準(zhǔn)函數(shù)的源碼如下驶忌,新版本里面加入了一些別的代碼矛辕,不過不影響這里的說明。
注:為了方便描述付魔,以下的a.*的a代表一個對象a聊品;下文中提到的等價只是功能上相同,用法上幾乎相同几苍,但在特殊情況下使用起來是會有細(xì)微的區(qū)別的翻屈,比如說a可能為空的時候。
以下四個標(biāo)準(zhǔn)函數(shù)妻坝,都是返回高階函數(shù)的返回值
run{}與a.run{}的區(qū)別:run{}里面的高階函數(shù)是運(yùn)行在當(dāng)前作用域內(nèi)伸眶,a.run{}里面的高階函數(shù)是運(yùn)行在對象a的作用域內(nèi)
a.run{}與a.let{}的區(qū)別:a.run{}里面的高階函數(shù)是運(yùn)行在對象a的作用域內(nèi),可以用this關(guān)鍵字(大部分情況下可省略)指代對象a刽宪,a.let{}是把對象a作為參數(shù)傳到高階函數(shù)里面厘贼,需要用it來指代對象a
with(a){} 等價于 a.run{}
publicinlinefun<R>run(block: () ->R): R = block()
publicinlinefun<T, R>T.run(block:T.() ->R): R = block()
publicinlinefun<T, R>T.let(block: (T) ->R): R = block(this)
publicinlinefun<T, R>with(receiver:T, block:T.() ->R): R = receiver.block()
以下兩個標(biāo)準(zhǔn)函數(shù)漆羔,都是返回調(diào)用對象本身
a.apply{}與a.also{}是等效的鳍咱,它們的區(qū)別類似run函數(shù)和let函數(shù)的區(qū)別
publicinlinefun<T>T.apply(block:T.() ->Unit): T { block();returnthis}
publicinlinefun<T>T.also(block: (T) ->Unit): T { block(this);returnthis}
或者可以這樣更直觀的來理解
a.run{ 通過this關(guān)鍵字(大部分情況下可省略)來使用對象a }? ? 返回值為{}中的返回值
run{} 等價于 this.run{}? ? 返回值為{}中的返回值
a.let{ 通過it來使用對象a }? ? 返回值為{}中的返回值
with(a){ 通過this關(guān)鍵字(大部分情況下可省略)來使用對象a }? ? 返回值為{}中的返回值
a.apply{ 通過this關(guān)鍵字(大部分情況下可省略)來使用對象a }? ? 返回值是對象a
a.also{ 通過it來使用對象a }? ? 返回值是對象a
轉(zhuǎn)載自:https://blog.csdn.net/feiying066/article/details/107065676/