코틀린 표준 라이브러리는 Object context 내에서 코드 블록 실행 목적의 여러 함수(apply, also, let, with, run)를 제공함
객체에서 이 함수를 사용하면 임시범위가 형성되며 이름 없이 객체에 접근할 수 있음!
위 다섯 가지 함수는
아주 대표적인 표
inline fun <T> T.apply(block: T.() -> Unit): T
receiver(this)
itself(context object)
receiver 객체 멤버에 대한 연산을 하고 코드블럭에 대한 결과를 리턴하지 않아도 되는 경우
ex. 객체의 초기화
👩💻 apply the following assignments to the object
inline fun <T> T.also(block: (T) -> Unit): T
argument(it)
itself(context object)
context object를 매개변수로 받아 일부 작업을 수행하는 데 사용
속성/함수가 아닌 객체 자체에 접근이 필요한 경우에 유용! (it을 사용해 접근해야하니까~)
ex. 객체의 사이트이펙트 확인
👩💻 and also do the following with the object
inline fun <T, R> T.let(block: (T) -> R): R
argument(it)
lambda result
한 개 이상 펑션의 결과를 call chain에 invoke할 때 사용
지정된 값이 null이 아닌 경우에 코드를 실행해야 하는 경우
단일 지역변수의 범위를 제한하는 경우 -> 새로운 변수를 context object로 정의해(it이 아닌 다른 이름을 붙여줄수도!) 더 읽기 쉽게 함
** 확장함수가 아님!
inline fun <T, R> with(receiver: T, block: T.() -> R): R
argument(it)
lambda result
Non-Nullable 수신 객체이고 결과가 필요하지 않은 경우
👩💻 with this object, do the following
inline fun <R> run(block: () -> R): R
inline fun <T, R> T.run(block: T.() -> R): R
available as a receiver(this)
lambda result
with랑 비슷한데, let처럼 context object의 확장함수로 동작하는 점이 다름
따라서, 람다식이 object 초기화와 연산을 포함하고 그 결과값을 리턴하는 경우에 유용함
ex. 어떤 값을 계산할 필요가 있거나 여러개의 지역변수의 범위를 제한할 때, 매개변수로 전달된 명시적 수신객체를 암시적 수신객체로 변환할 때
+) non-extension function으로도 사용할 수 있음 -> 객체화 해 여러번 실행하도록 할 수 있음