Ключевое слово 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
}
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) // Функция верхнего уровня