아이템 15. 리시버를 명시적으로 참조하라

아이템 15. 리시버를 명시적으로 참조하라

리시버를 명시적으로 참조하라 #

여러 개의 리시버 #

스코프 내부에 둘 이상의 리시버가 있는 경우, 리시버를 명시적으로 나타내면 좋다. 즉 리시버가 헷갈릴 수 있는 경우, 명시적으로 표현하자.

또, 리시버가 중첩되는 경우 목적에 맞는 함수를 잘 구분해서 쓰자. (e.g. let, apply, also, with, run)

class Node(val name: String) {
    fun makeChild(childName: String) {
        create("$name.$childName").apply {
            print("Created ${this?.name} in ${this@Node.name}") // this@Node와 같이 label 을 활용할 수 있다.
        }
    }
}

label 없이 리시버 사용하면, 가장 가까운 리시버를 의미한다.


DSL 마커 #

" 코틀린 DSL을 사용할 때는 여러 리시버를 가진 요소들이 중첩되더라도, 리시버를 명시적으로 붙이지 않습니다. DSL은 원래 그렇게 사용하도록 설계되었기 때문입니다. “

@DslMarker

:thinking:


요약 #

  • 짧게 적을 수 있다는 이유만으로 리시버(표현)을 제거하지 말자.
    • 헷갈릴 수 있는 경우 명시적으로 표현하자.