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