Выражения this
Выражение this ссылается на текущий получатель (объект, с которым работает функция). Использование this зависит от контекста:
-
В члене класса
thisссылается на текущий объект этого класса.Например, в следующем коде
this.nameозначает свойствоnameтекущего объектаLanguage:class Language(val name: String) { fun printName() { println(this.name) } } fun main() { val language = Language("Kotlin") language.printName() // Kotlin } -
В функции-расширении или литерале функции с получателем
thisссылается на получателя.В следующем примере
lastCharacter()вызывается для строки"Kotlin". Поэтому"Kotlin"является получателем. Внутри функции-расширенияthisссылается на"Kotlin". Это означает, чтоthis.length— длина"Kotlin":fun String.lastCharacter(): Char { println(this.length) // 6 return this[this.length - 1] } fun main() { println("Kotlin".lastCharacter()) // n }
Квалифицированный this
Когда области видимости получателей вложены, в вашем коде одновременно может быть доступно несколько получателей. Kotlin может использовать любой доступный получатель для неявного доступа к его членам, но получатели из внутренних областей видимости имеют более высокий приоритет. Чтобы явно обратиться к определённому получателю, используйте квалифицированный this. Это особенно полезно, когда у нескольких получателей есть члены с одинаковыми именами и нужно обратиться к члену внешнего получателя.
Чтобы использовать квалифицированный this, добавьте квалификатор метки:
this@label
Метка указывает компилятору, к какому получателю обращаться. Можно использовать имя внешнего класса или функции-расширения. Например, this@foo ссылается на получателя внешней функции-расширения с именем foo.
Доступ к внешнему классу из внутреннего класса
В внутреннем классе неквалифицированное this ссылается на экземпляр внутреннего класса. Чтобы обратиться к объекту внешнего класса, используйте квалифицированное this:
class User(val name: String) {
inner class Age(val value: Int) {
fun printInfo() {
// Refers to the value property of the current Age object
println(this.value)
// 22
// Refers to the name property of the outer User object
println(this@User.name)
// Jane Doe
}
}
}
fun main() {
val user = User("Jane Doe")
val age = user.Age(22)
age.printInfo()
}
Доступ к классу из функции-расширения
Если объявить функцию-расширение внутри класса, будут доступны два получателя:
Получатель расширения: значение, для которого вызывается функция-расширение.
Получатель-диспетчер: текущий объект класса, в котором объявлена функция-расширение.
Используйте квалифицированный this, чтобы указать нужного получателя:
class User(val name: String) {
val prefix = "Name"
fun String.formatName(): String {
return "${this@User.prefix}: ${this.uppercase()}"
}
fun printName() {
println(name.formatName())
}
}
fun main() {
val user = User("Jane Doe")
user.printName()
// Name: JANE DOE
}
Здесь:
thisссылается на получателя расширения (String), поэтомуthis.uppercase()преобразует строку в верхний регистр.this@Userссылается на текущий объектUser.this@User.prefixобращается к свойствуprefixтекущего объектаUser.
Доступ из лямбда-выражения
В отличие от обычной лямбды, лямбда с получателем вводит получателя в свою область видимости. В результате this внутри лямбды ссылается на получателя лямбды, а не на получателя из внешней области видимости. Если лямбда с получателем вложена в другую область видимости получателя, добавьте к лямбде метку и используйте квалифицированный this, чтобы явно обратиться к получателю лямбды или к получателю из внешней области видимости:
class User(val name: String) {
fun printWithPrefix() {
val printString: String.() -> Unit = stringLabel@ {
println("${this@stringLabel}: ${this@User.name}")
}
printString("User")
}
}
fun main() {
val user = User("Jane Doe")
user.printWithPrefix()
// User: Jane Doe
}
Здесь:
stringLabel@задаёт метку лямбды.this@stringLabelссылается на строку-получатель лямбды.this@Userссылается на текущий объектUser.
Метка ничего не вызывает и не меняет работу лямбды. Она лишь помогает обратиться к получателю лямбды.
Доступ к анонимному объекту или его внешнему классу
Анонимный объект имеет собственную область видимости получателя. В теле объекта неквалифицированное this ссылается на сам анонимный объект. Однако анонимные объекты не имеют имён классов, поэтому их нельзя использовать в качестве квалификаторов this. Таким образом, обратиться к анонимному объекту можно только с помощью неквалифицированного this:
interface UserPrinter {
fun print()
}
fun main() {
val printer = object : UserPrinter {
val prefix = "User"
override fun print() {
// `this` refers to the anonymous object
// `this.prefix` accesses its `prefix` property
println(this.prefix)
}
}
printer.print()
// User
}
Если объявить анонимный объект внутри другого класса, для доступа к внешнему объекту можно использовать квалифицированное this:
interface UserPrinter {
fun print()
}
class User(val name: String) {
fun createPrinter(): UserPrinter {
return object : UserPrinter {
override fun print() {
// `this@User` refers to the enclosing `User` object
// `this@User.name` accesses its `name` property
println(this@User.name)
}
}
}
}
fun main() {
val printer = User("Jane Doe").createPrinter()
printer.print()
// Jane Doe
}
Неявный this
При вызове функции-члена для this можно опустить квалификатор this.. Однако, если в более близкой лексической области видимости доступен другой вызываемый элемент с таким же именем, Kotlin связывает неквалифицированный вызов с этим элементом, а не с функцией-членом. Чтобы явно вызвать функцию-член, используйте квалификатор this.:
fun main() {
class A {
fun printLine() {
println("Member function")
}
fun invokePrintLine() {
fun printLine() {
println("Local function")
}
printLine()
// Local function
this.printLine()
// Member function
}
}
A().invokePrintLine()
}
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/this-expressions.html