ПрограммированиеBackend разработчик

Что такое infix-функции в Kotlin, как их объявлять и правильно использовать, какие ограничения существуют? Приведите пример создания собственной infix-функции и расскажите о подводных камнях.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

Infix-функция — это функция, которую можно вызывать в инфиксной форме (без точки и скобок), что повышает читаемость кода. Такие функции удобны, например, для создания DSL (domain-specific languages).

Как объявить infix-функцию:

  • Функция должна быть методом класса/extension-функцией.
  • Иметь ровно один параметр.
  • Объявляется с модификатором infix.
  • Не допускает использования vararg и default value для параметра.

Пример:

infix fun Int.add(x: Int): Int = this + x val result = 5 add 10 // 15

Преимущества:

  • Повышение читабельности, особенно для вычислений или цепочек вызовов.
  • Применимо для построения коллекций, проверки условий (например, x to y).

Ограничения и подводные камни:

  • Infix доступен только для методов с ОДНИМ обязательным параметром.
  • Приоритет выполнения infix ниже, чем у операторов сравнения и арифметических операторов (что иногда приводит к сюрпризам с приоритетом операций).
  • Инфикс-функция не работает с параметрами по умолчанию и vararg.

Вопрос с подвохом.

Можно ли использовать infix-функцию с несколькими параметрами или с параметрами по умолчанию?

Ответ: Нет, нельзя. Infix-функция может иметь ровно один обязательный параметр без значения по умолчанию и без vararg.

Пример неверного объявления:

// Ошибка! infix fun foo(a: Int, b: Int) { }

Примеры реальных ошибок из-за незнания тонкостей темы:


История

В проекте пытались внедрить infix-функцию, чтобы заменить вызовы builder-функций на более читаемые инфиксные выражения. Из-за незнания ограничения на количество параметров функцию объявили с двумя параметрами — студенты долго не могли понять, почему компиляция не проходит.


История

Разработчик использовал infix-выражения в большом арифметическом выражении без скобок, полагая, что приоритет операций такой же, как у традиционных математических операторов. В результате выражения вычислялись не так, как ожидалось — пришлось переписывать с явными скобками.


История

Внутри коллекции реализовали paring через infix ("item to value") и применяли внутри nesting, однако из-за недопонимания синтаксиса два вложенных infix-вызова не сработали — сработало только задание пары на верхнем уровне, вложенные пары были проигнорированы, что привело к потерям значимых данных.