'Android'에 해당되는 글 31건
- 2019.06.19 (개인공부)apply, run, with, also, let 구분해보기
참조 : https://medium.com/@fatihcoskun/kotlin-scoping-functions-apply-vs-with-let-also-run-816e4efb75f5
예제용 클래스
class User {
var name: String? = null
var age: Int = 0
fun intoduce(): String{
return "$name is $age old.";
}
}
1> apply
fun T.apply(block: T.() -> Unit): T
apply 함수를 호출하는 객체를 블록의 리시버로 넘기고, 객체를 반환한다.
var user = User().apply{
this.name = "Ryudmila"
this.age = 16
}
user.intoduce()
>>[Print] : Ryudmila is 16 old.
2> run
fun <T, R> T.run(block: T.() -> R): R
run 함수를 호출하는 객체를 블록의 리시버로 넘기고, 블럭의 결과를 반환한다.
var a = user.run{
this.age = this.age + 5
age
}
print(a)
>>[Print] : 21
--------------------------------
* run은 2가지 방식이 있다.
인자가 없는 익명 함수
fun run(block: () -> R): R
--------------------------------
3> with
fun <T, R> with(receiver: T, block: T.() -> R): R
with 함수를 호출하는 객체를 블록의 리시버로 넘기고, 블럭의 결과를 반환한다.
var b = with(user){
this.name = "Ryud"
"$name changed."
}
print(b) //b type > String
>>[Print] : Ryud changed.
4> also
fun T.also(block: (T) -> Unit): T
also 함수를 호출하는 객체를 파라메터로 넘기고, 객체를 반환한다.
user.also {
it.name = "Ryudmila"
}.intoduce()
>>[Print] : Ryudmila is 21 old.
5> let
fun <T, R> T.let(block: (T) -> R): R
let 함수를 호출하는 객체를 파라메터로 넘기고, 블럭의 결과를 반환한다.
user.let{
it.age -= 10
it.age
} + 20
>> user.age -> 31
** 리시버 - 접근 범위가 객체 자체가 된다. (메서드나 변수에 직접 접근하여 사용가능)
- this를 통해 객체 사용.
** 파라메터 - it을 통해 객체 사용.