Ключевое слово 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, типа String
            }

            val funLit2 = { s: String ->
                // объект-приёмник функции foo(), поскольку окружающее лямбда-выражение
                // не имеет объекта-приёмника
                val d1 = this
            }
        }
    }
}

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

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

fun main() {
    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) // Локальная функция
}

{kotlin-runnable=“true” kotlin-min-compiler-version=“1.3”}