輕鬆理解kotlin中標準函數let、run、with、apply、also的區別

kotlin中,let、run、with、apply、also這幾個標準函數使用起來非常方便,合理使用可以很大程度上的簡化代碼,但是這幾個標準函數用法和功能相似,初學kotlin時,很容易會不知道該選哪一個,其實看下源碼並熟悉kotlin的高階函數就很容易理解了。這幾個標準函數的源碼如下,新版本里面加入了一些別的代碼,不過不影響這裏的說明。

注:爲了方便描述,以下的a.*的a代表一個對象a;下文中提到的等價只是功能上相同,用法上幾乎相同,但在特殊情況下使用起來是會有細微的區別的,比如說a可能爲空的時候。

以下四個標準函數,都是返回高階函數的返回值

  • run{}與a.run{}的區別:run{}裏面的高階函數是運行在當前作用域內,a.run{}裏面的高階函數是運行在對象a的作用域內
  • a.run{}與a.let{}的區別:a.run{}裏面的高階函數是運行在對象a的作用域內,可以用this關鍵字(大部分情況下可省略)指代對象a,a.let{}是把對象a作爲參數傳到高階函數裏面,需要用it來指代對象a
  • with(a){} 等價於 a.run{}
public inline fun <R> run(block: () -> R): R = block()
public inline fun <T, R> T.run(block: T.() -> R): R = block()
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

以下兩個標準函數,都是返回調用對象本身

  • a.apply{}與a.also{}是等效的,它們的區別類似run函數和let函數的區別
public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

或者可以這樣更直觀的來理解

  • a.run{ 通過this關鍵字(大部分情況下可省略)來使用對象a }    返回值爲{}中的返回值
  • run{} 等價於 this.run{}    返回值爲{}中的返回值
  • a.let{ 通過it來使用對象a }    返回值爲{}中的返回值
  • with(a){ 通過this關鍵字(大部分情況下可省略)來使用對象a }    返回值爲{}中的返回值
  • a.apply{ 通過this關鍵字(大部分情況下可省略)來使用對象a }    返回值是對象a
  • a.also{ 通過it來使用對象a }    返回值是對象a

 

本人也是初學kotlin,水平有限,如有錯誤,歡迎指正。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章