Kotlin Scope Functions (作用域函式)
Kotlin 標準函式庫提供了 5 個非常有名的函式:let, run, with, apply, also。
它們的功能非常相似:在一個物件的 Context (作用域) 中執行程式碼。
差別在於:
- 這個物件在
block裡面是用this還是it參考? - 這個函式最後回傳的是 物件本身 還是 Block 的執行結果?
這張表背起來就對了:
| 函式 | 物件參考 | 回傳值 | 主要用途 |
|---|---|---|---|
| let | it | Block 結果 | 配合 ?.let 做 Null check |
| apply | this | 物件本身 | 物件初始化與設定 |
| run | this | Block 結果 | 執行區塊並計算結果 |
| also | it | 物件本身 | 額外操作 (如 Log) |
| with | this | Block 結果 | 針對一個物件多次操作 (非 Extension) |
let
最常用來處理 Nullable 物件。
val name: String? = "Miko"
name?.let {
// 只有當 name 不是 null 時才會執行這裡
println("Name length is ${it.length}")
}
apply
最常用來設定物件初始化屬性(尤其是 Android 的 Intent 或 View)。
val person = Person().apply {
name = "Miko"
age = 18
} // 回傳設定好的 person 物件
also
適合用來做「副作用」操作,例如 Log,不影響原本流程。
val person = Person("Miko").also {
println("Create person: $it")
}