Ключевое слово 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
            }
        }
    }
}

Подразумеваемое this

Когда вы вызываете функцию-член для this, вы можете пропустить this часть. Если у вас есть функция, не являющаяся членом, с тем же именем, используйте ее с осторожностью, потому что в некоторых случаях может быть вызвана она.

fun printLine() { println("Функция верхнего уровня") }

class A {
    fun printLine() { println("Функция-член") }

    fun invokePrintLine(omitThis: Boolean = false)  { 
        if (omitThis) printLine()
        else this.printLine()
    }
}

A().invokePrintLine() // Функция-член
A().invokePrintLine(omitThis = true) // Функция верхнего уровня