跳到主內容

【Kotlin】run , let, apply, also, let

https://developer.android.com/codelabs/java-to-kotlin#0

https://kotlinlang.org/docs/scope-functions.html

功能

物件引用

傳回值

是擴充函數

let

it

Lambda result

Yes

run

this

Lambda result

Yes

run

-

Lambda result

否:在沒有上下文物件的情況下調用

with

this

Lambda result

否:將上下文物件作為參數。

apply

this

Context object

Yes

also

it

Context object

Yes

下面的專門部分提供了有關這些功能的詳細資訊。
以下是根據預期目的選擇作用域函數的簡短指南:

  • 對不可為 null 的物件執行 lambda:let
  • 在局部範圍內引入表達式作為變數:let
  • 物件配置:apply
  • 物件配置和計算結果:run
  • 在需要表達式的地方運行語句:非擴展run
  • 附加效果:also
  • 將物件的函數呼叫進行分組:with

差異

由於作用域函數本質上很相似,因此了解它們之間的差異非常重要。每個作用域函數之間有兩個主要差異:
  • 他們引用上下文物件的方式。
  • 他們的返回值。
fun main() {
    val str = "Hello"
    // this
    str.run {
        println("The string's length: $length")
        //println("The string's length: ${this.length}") // does the same
    }

    // it
    str.let {
        println("The string's length is ${it.length}")
    }
}

this

run、with、 並透過關鍵字apply引用上下文物件作為 lambda接收器this。因此,在它們的 lambda 中,物件就像在普通類別函數中一樣可用。

大多數情況下,您可以this在存取接收者物件的成員時省略,從而使程式碼更短。另一方面,如果this省略,則很難區分接收者成員和外部物件或函數。
因此this,對於主要透過呼叫其函數或為屬性賦值來操作物件成員的 lambda,建議將上下文物件作為接收者 ()。
val adam = Person("Adam")
  .apply {
    age = 20 // same as this.age = 20 
    city = "London" 
  } 
println(adam)