0Pricing
Kotlin Academy · Урок

Функции-операторы

Перегружайте 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 — локальная установка не требуется.

Все уроки этого курса

  1. Функции-операторы
  2. Операторы сравнения
  3. Индексация и вызов
  4. Лучшие практики
← Назад к Kotlin Academy