Функции: объявление и параметры по умолчанию

Учимся объявлять функции и делать их вызовы гибкими.

Функция — именованный блок кода, который принимает параметры и может возвращать значение; объявляется ключевым словом fun.

Функции — основной способ структурировать программу. В Kotlin их синтаксис лаконичен, а две идиомы — параметры по умолчанию и именованные аргументы — заметно упрощают вызовы.

Базовое объявление

После имени в скобках перечисляют параметры (имя: тип), а после двоеточия указывают тип возвращаемого значения.

fun sum(a: Int, b: Int): Int {
    return a + b
}

fun main() {
    println(sum(2, 3))
}

Вывод:

5

Однострочные функции

Если тело — одно выражение, фигурные скобки и return заменяют знаком =. Тип результата компилятор часто выводит сам.

fun square(x: Int) = x * x
fun greet(name: String) = "Привет, $name"

fun main() {
    println(square(4))
    println(greet("мир"))
}

Вывод:

16
Привет, мир

Параметры по умолчанию и именованные аргументы

Параметру можно задать значение по умолчанию — тогда при вызове его разрешено опустить. А именованные аргументы позволяют передавать значения в любом порядке и делают вызов читаемым.

fun greeting(name: String, prefix: String = "Привет") =
    "$prefix, $name!"

fun main() {
    println(greeting("Аня"))
    println(greeting("Боря", "Здравствуй"))
    println(greeting(prefix = "Хей", name = "Вера"))
}

Вывод:

Привет, Аня!
Здравствуй, Боря!
Хей, Вера!

Как работает под капотом

Параметры по умолчанию избавляют от «перегрузок» — нескольких версий одной функции с разным числом аргументов, как принято в Java. Одна функция с дефолтами заменяет их все. Когда вы опускаете аргумент, компилятор подставляет в вызов значение по умолчанию. А именованные аргументы особенно полезны, когда у функции много параметров: вызов greeting(prefix = "Хей", name = "Вера") читается как фраза и не зависит от порядка.

Частые ошибки

  • Создавать перегрузки вместо дефолтов. В Kotlin лучше один параметр со значением по умолчанию.
  • Забывать тип возврата у блочной функции. Если тело в фигурных скобках с return, тип результата нужно указать (кроме Unit).
  • Передавать аргументы не в том порядке без имён. При неочевидном порядке используйте именованные аргументы.

Итог

  • Функции объявляются через fun, тип результата — после двоеточия.
  • Однострочную функцию можно записать через = без return.
  • Параметры по умолчанию заменяют множество перегрузок.
  • Именованные аргументы делают вызов читаемым и независимым от порядка.
Проверьте себя
1. Как записать однострочную функцию, возвращающую x * x?
Afun square(x: Int) { x * x }
Bfun square(x: Int) = x * x
Cfun square(x: Int): return x * x
Dfun square(x: Int) -> x * x
2. Что дают параметры по умолчанию?
AУскоряют выполнение функции
BПозволяют опускать аргумент при вызове, заменяя перегрузки
CДелают функцию приватной
DЗапрещают менять значение
3. Зачем нужны именованные аргументы?
AЧтобы передавать значения в любом порядке и сделать вызов читаемее
BЧтобы ускорить компиляцию
CЧтобы скрыть параметры
DЧтобы задать значения по умолчанию