'Android'에 해당되는 글 31건

  1. 2019.06.19 (개인공부)apply, run, with, also, let 구분해보기

(개인공부)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을 통해 객체 사용.

 

 

https://docs.google.com/spreadsheets/d/1P2gMRuu36pSDW4fdwE-fLN9fcA_ZboIU2Q5VtgixBNo/edit#gid=0

 

 

 

 

 

 

 

And