[Kotlin] Scope Function : apply, run, with, also, let μ 리
π Scope function λ?
μ 곡λ λλ€ μμ΄ μλ κ°μ²΄μμ μ΄λ¬ν ν¨μλ₯Ό νΈμΆνλ©΄ μμ λ²μκ° νμ± λλλ°, μ΄ λ²μ λ΄μμλ μ΄λ¦ μμ΄ κ°μ²΄μ μ κ·Όν μ μμ΅λλ€.
μ¦ νΉμ λ²μ {} μμμ νΉμ κ°μ²΄λ₯Ό this λ it μ ν΅ν΄ μ κ·Ό λ° μ‘°μμ΄ κ°λ₯ν ν¨μμ λλ€.
scope functionμ μ½λλ₯Ό λ κ°κ²°νκ³ μ½κ³ μ½κ² λ§λ€ μ μμ΅λλ€.
scope function μ λκ°μ§ κ΅¬μ± μμλ‘ μ΄λ£¨μ΄μ Έ μλλ° μμ κ°μ²΄(receiver) μ μμ κ°μ²΄ μ§μ λλ€ μ λλ€.
μ¬κΈ°μ μμ κ°μ²΄λ νμ₯ ν¨μκ° νΈμΆλλ λμμ΄ λλ κ°μ²΄ μ λλ€.
μμ κ°μ²΄ μ§μ λλ€λ λλ¨Έμ§ κ΅¬μ±μμμΈ block λΆλΆ μ λλ€.
μ΄λ¬ν ν¨μλ μ΄ 5κ°μ§λ‘ apply, run, with, also, let κ° μμ΅λλ€.
apply, run, with, also, let λ λ§€μ° λΉμ·ν μμ μ μνν©λλ€.
ν¨μ | κ°μ²΄ μ°Έμ‘° | return κ° |
apply | this | κ°μ²΄ μ체 |
run | this | λλ€ κ²°κ³Ό |
with | this | λλ€ κ²°κ³Ό |
also | it | κ°μ²΄ μ체 |
let | it | λλ€ κ²°κ³Ό |
μλλ λͺ©μ μ λ°λ₯Έ μ¬μ©μ μν κ°λ¨ν Guide!
1. null μ΄ μλ κ°μ²΄μμ λλ€ μ€νν λ : let
2. λ‘컬 λ²μμμ λ³μλ‘ ννμ νμν λ : let
3. κ°μ²΄ ꡬμ±ν λ : apply
4. κ°μ²΄ ꡬμ±νκ³ λ° κ²°κ³Ό κ³μ°ν λ : run
5. ννμμ΄ νμν μ€ν λ¬Έ : λΉνμ₯ run
6. μΆκ°ν¨κ³Ό : also
7. κ°μ²΄μ λν ν¨μ νΈμΆ κ·Έλ£Ήν : with
πͺ 1. apply : κ°μ²΄ ꡬμ±ν λ
inline fun <T> T.apply(block: T.() -> Unit): T
context object - receiver(this) λ‘ μ¬μ©ν μ μλ€. ( T.() λ νλΌλ―Έν°κ° μμ΄μ this λ§ μ λ¬ )
return - κ°μ²΄ μ체
μμ)
// apply λ₯Ό μ¬μ©νμ§ μμ λ
val person = Person()
person.name = "yura"
person.job = "developer"
// apply μ μ©
val person = Person().apply{
name = "yura"
job = "developler"
}
πͺ 2. run : κ°μ²΄ ꡬμ±νκ³ λ° κ²°κ³Ό κ³μ°ν λ
inline fun <T, R> T.run(block: T.() -> R): R
context object - recevier(this) λ‘ μ¬μ©ν μ μλ€. ( T.() λ νλΌλ―Έν°κ° μμ΄μ this λ§ μ λ¬ )
return - λλ€ κ²°κ³Ό κ°
val person = Person("yura", "developer", 25)
// run μ μ©
val nextAge = person.run{
age++
}
println(nextAge) //26
πͺ 3. with : null μ΄ λ μ μλ(non-null) μμ κ°μ²΄μ΄κ³ κ²°κ³Όκ° νμνμ§ μλ κ²½μ°μ μ¬μ©νλ€.
inline fun <T, R> with(receiver: T, block: T.() -> R): R
context object - recevier(this) λ‘ μ¬μ©ν μ μλ€. ( T.() λ νλΌλ―Έν°κ° μμ΄μ this λ§ μ λ¬ )
return - λλ€ κ²°κ³Ό κ°
val person = Person("yura", "developer")
// with λ₯Ό μ¬μ©νμ§ μμ λ
println(person.name)
println(person.job)
// with μ μ©
with(person) {
println(name)
println(job)
}
πͺ 4. also : μμ κ°μ²΄μ μμ±μ λ° κΈ°λ₯μ μ¬μ©νμ§ μκ³ μ°Έμ‘°κ° νμν μμ μ μ¬μ©
inline fun <T> T.also(block: (T) -> Unit): T
context object - μΈμ ( it )
return - κ°μ²΄ κ·Έμ체
val person = Person("yura", "developer")
val info = person.also{
println(it.name)
}
πͺ 5. let : λ‘컬 λ²μμμ λ³μλ‘ ννμμ΄ νμν λ or null μ΄ μλ λ μ½λλ₯Ό μ€νν΄μΌν κ²½μ°(?.)
inline fun <T, R> T.let(block: (T) -> R): R
context object - μΈμ ( it )
return - λλ€ κ²°κ³Όκ°
val person: Person? = Person("yura", "developer")
val result = person?.let{
"{$name is $job}"
}
println(result) //yura is developer
https://kotlinlang.org/docs/scope-functions.html#functions
Scope functions | Kotlin
kotlinlang.org