리시버를 명시적으로 참조하라 #
여러 개의 리시버 #
스코프 내부에 둘 이상의 리시버가 있는 경우, 리시버를 명시적으로 나타내면 좋다. 즉 리시버가 헷갈릴 수 있는 경우, 명시적으로 표현하자.
또, 리시버가 중첩되는 경우 목적에 맞는 함수를 잘 구분해서 쓰자. (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:
요약 #
- 짧게 적을 수 있다는 이유만으로 리시버(표현)을 제거하지 말자.
- 헷갈릴 수 있는 경우 명시적으로 표현하자.