본문 바로가기

Reading Record/이펙티브 코틀린

[이펙티브 코틀린] Item15. 리시버를 명시적으로 참조하라

this
- 함수와 프로퍼티를 지역 또는 톱레벨 변수가 아닌 다른 리시버로부터 가져온다는 것을 나타낼 수 있다
- 확장 리시버를 명시적으로 참조가 가능하다. (확장 메서드에서의 this)

여러 개의 리시버

스코프 내부에 둘 이상의 리시버가 있는 경우, 리시버를 명시적으로 나타내자
> 짧게 적을 수 있다는 이유만으로 리시버를 제거하지 말자.

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

리시버는 주로 apply, with, run, also, let에서 사용된다.

@ : qualified this - outer scope에 있는 this를 접근할 수 있다.

[코드 삽입하기]

 

DSL 마커

코틀린 DSL : 여러 리시버를 가진 요소들이 중첩되어도 리시버를 명시적으로 붙이지 않도록 설계되어 있다.

DSL에서 외부 스코프에 있는 리시버를 명시적으로 적게 강제하고 싶다면 Dsl 메타 어노테이션을 사용한다.

@DslMaker :암묵적으로 외부 리시버를 사용하는 것을 막는 메타 어누테이션 (어노테이션을 위한 어노테이션)
가장

@DslMaker
annotation class HtmlDsl

fun table(f: TableDsl.() -> Unit) { /*…*/}

@HtmlDsl
class TableDsl { /*….*/ }