Ключевое слово this
Чтобы обозначить текущий объект-приёмник, используются выражения 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 // 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”}