Функции-операторы
Перегружайте plus, minus и другие операторы
«Функции-операторы» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое перегрузка операторов
Перегрузка операторов позволяет Вашим типам реагировать на такие символы, как + или -. Вы определяете функцию с модификатором operator и специальным именем.
data class Point(val x: Int, val y: Int) {
operator fun plus(o: Point) = Point(x + o.x, y + o.y)
}
fun main() {
println(Point(1, 2) + Point(3, 4))
}Ключевое слово operator
Модификатор operator сообщает компилятору, что эта функция реализует оператор. Без него вызов a + b не сработал бы.
data class Money(val amount: Int) {
operator fun plus(o: Money) = Money(amount + o.amount)
}
fun main() {
println(Money(5) + Money(3))
}Стандартные имена
Каждому оператору соответствует фиксированное имя функции: plus для +, minus для -, times для *, div для /, rem для %.
data class Vec(val n: Int) {
operator fun times(k: Int) = Vec(n * k)
}
fun main() {
println(Vec(4) * 3)
}Минус и умножение
Можно определить несколько операторов для одного и того же типа.
data class Point(val x: Int, val y: Int) {
operator fun minus(o: Point) = Point(x - o.x, y - o.y)
operator fun times(k: Int) = Point(x * k, y * k)
}
fun main() {
println(Point(5, 5) - Point(1, 2))
println(Point(2, 3) * 2)
}Унарные операторы
Унарному минусу соответствует unaryMinus, унарному плюсу — unaryPlus, а оператор ! реализуется функцией not.
data class Temp(val c: Int) {
operator fun unaryMinus() = Temp(-c)
}
fun main() {
println(-Temp(10))
}Инкремент и декремент
inc реализует ++, а dec — --. Они возвращают новое значение того же типа.
data class Counter(val n: Int) {
operator fun inc() = Counter(n + 1)
}
fun main() {
var c = Counter(0)
c++
println(c.n)
}Составное присваивание
plusAssign реализует += для изменяемых получателей. Если существует только plus, оператор += вместо этого повторно присваивает значение переменной.
class Bag {
val items = mutableListOf<String>()
operator fun plusAssign(item: String) { items.add(item) }
}
fun main() {
val bag = Bag()
bag += "apple"
println(bag.items)
}Операторы для разных типов
Тип параметра не обязан совпадать с типом получателя. Например, масштабирование точки с помощью Int возвращает точку.
data class Size(val w: Int, val h: Int) {
operator fun times(factor: Int) = Size(w * factor, h * factor)
}
fun main() {
println(Size(2, 3) * 4)
}Функции-расширения
Операторы можно определять как функции-расширения, даже для типов, которыми Вы не владеете.
data class Point(val x: Int, val y: Int)
operator fun Point.plus(o: Point) = Point(x + o.x, y + o.y)
fun main() {
println(Point(1, 1) + Point(2, 2))
}Цепочки операторов
Перегруженные операторы сочетаются так же, как встроенные, с соблюдением обычного приоритета.
data class N(val v: Int) {
operator fun plus(o: N) = N(v + o.v)
operator fun times(o: N) = N(v * o.v)
}
fun main() {
val r = N(2) + N(3) * N(4)
println(r.v)
}Типы результата не ограничены
Оператор может возвращать любой тип, но возврат того же типа делает использование понятным и позволяет выстраивать цепочки вызовов.
data class Vec(val x: Int, val y: Int) {
operator fun plus(o: Vec) = Vec(x + o.x, y + o.y)
}
fun main() {
println(Vec(1, 2) + Vec(3, 4))
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли операторные функции.
Итоги
Вы узнали об операторных функциях:
- Помечайте функции модификатором
operatorи стандартным именем (plus,minus,timesи т. д.). - Поддерживаются унарные операторы, операторы инкремента и составного присваивания.
- Операторы могут быть членами класса или функциями-расширениями.
- Возврат того же типа делает цепочки вызовов понятными.
data class P(val x: Int) {
operator fun plus(o: P) = P(x + o.x)
}
fun main() {
println((P(2) + P(3)).x)
}Часто задаваемые вопросы
Урок «Функции-операторы» бесплатный?
Да — полный текст урока «Функции-операторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Функции-операторы»?
Перегружайте plus, minus и другие операторы Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Функции-операторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции-операторы
- Операторы сравнения
- Индексация и вызов
- Лучшие практики