[Kotlin] 5-5. this식

this식

현재 리시버를 지정하려면 this식을 사용한다

this에 한정자가 없으면 가장 안쪽을 둘러싼 범위를 참조한다. 다른 범위의 this를 참조하려면 라벨 한정자를 사용한다

한정된 this

외부 범위(클래스나 확장 함수 , 또는 라벨이 있는 리시버를 가진 함수 리터럴)에서 this에 접근하려면 this@label 형식을 사용한다. 여기서 @label은 this가 속한 범위를 의미하는 라벨이다

class A {  // 암묵적으로 @A 라벨 사용
  inner class B {  // 암묵적으로 @B 라벨 사용
    fun Int.foo() {  // 암묵적으로 @foo 라벨 사용
      val a = this@A  // A의 this
      val b = this@B  // B의 this
      
      val c = this  // foo()의 리시버인 Int
      val c1 = this@foo  // foo()의 리시버인 Int
      
      val funLit = lambda@ fun String.() {
        val d = this  // funLit의 서버
      }
      
      val funLit2 = { s: String ->
        // 둘러싼 람다식에 리시버가 없으므로 foo()의 리시버
        val d1 = this
      }
    }
  }
}