Ключевое слово 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 // this из A
            val b = this@B // this из B

            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
            }
        }
    }
}