Українська
Параметри та аргументи
Параметри за замовчуванням та іменовані аргументи
Значення за замовчуванням підставляється, коли відповідного аргументу немає у виклику. Воно є частиною API. Зміна типового відсотка або режиму може змінити поведінку старих викликів, навіть якщо сигнатура все ще компілюється.
Іменований аргумент має форму discount = 0.1. Він пояснює значення без потреби згадувати порядок кількох однотипних параметрів і дозволяє пропустити параметр із типовим значенням. Після перестановки аргументів використовуйте імена послідовно, щоб уникнути неоднозначного читання.
Приклад 1. Ціна зі знижкою
kotlin
import java.util.Locale
fun discountedPrice(amount: Double, discount: Double = 0.0): Double {
require(amount.isFinite() && amount >= 0.0)
require(discount.isFinite() && discount in 0.0..1.0)
return amount * (1.0 - discount)
}
fun formatPrice(
amount: Double,
currency: String = "UAH",
digits: Int = 2
): String {
require(amount.isFinite())
require(currency in setOf("UAH", "EUR", "USD"))
require(digits in 0..4)
return String.format(
Locale.ROOT, "%.${digits}f %s", amount, currency
)
}
fun main() {
println(formatPrice(discountedPrice(1250.5)))
val sale = discountedPrice(amount = 1000.0, discount = 0.15)
println(formatPrice(sale, digits = 0))
println(formatPrice(amount = 12.5, currency = "EUR", digits = 1))
check(discountedPrice(10.0, discount = 1.0) == 0.0)
}text
1250.50 UAH
850 UAH
12.5 EURДля фінансового обліку двійковий Double не є універсальним представленням грошей. Тут він демонструє функції й форматування. У наступних задачах точні суми можна зберігати цілими копійками або застосовувати BigDecimal із явно заданим округленням. Формат із двома цифрами лише змінює текст, а не точність внутрішнього значення.

Рис. 3.2. Імена параметрів роблять виклик із кількома аргументами зрозумілим.
Позиційні й іменовані аргументи можна поєднувати за правилами мови, але переставлені аргументи мають бути названими. Не передавайте той самий параметр двічі. Ім’я параметра стає важливим для вихідної сумісності: перейменування може зламати іменовані виклики навіть без зміни типів.
Параметри за замовчуванням часто замінюють набір перевантажень з різною кількістю аргументів. Для Java-викликачів анотація @JvmOverloads може створити відповідні перевантаження, але її не потрібно додавати до кожної навчальної функції. Іменовані аргументи для звичайних Java-методів не підтримуються так само, як для Kotlin-функцій: Java API може не зберігати надійних імен параметрів.
Vararg та розгортання масиву
vararg дозволяє передати змінну кількість аргументів одного типу. Усередині функції вони доступні як масив. Для vararg Int це спеціалізований IntArray. Функція може мати лише один vararg-параметр; якщо після нього є інші параметри, їх зазвичай передають іменовано.
Оператор розгортання *array передає елементи вже наявного масиву як окремі аргументи. Сам масив і його елементи – різні рівні даних, тому без зірочки тип аргументу може не збігтися. Масиви детально розглядаються в темі 10; тут достатньо конструктора intArrayOf та обходу через for.
Приклад 2. Статистика чисел
kotlin
fun describe(vararg values: Int, label: String = "numbers"): String {
if (values.isEmpty()) return "$label: empty"
var minimum = values[0]
var maximum = values[0]
var sum = 0L
for (value in values) {
if (value < minimum) minimum = value
if (value > maximum) maximum = value
sum += value.toLong()
}
val mean = sum.toDouble() / values.size
return "$label: min=$minimum max=$maximum mean=$mean"
}
fun main() {
println(describe(2, 4, 6))
val measurements = intArrayOf(-5, 0, 5)
println(describe(*measurements, label = "sample"))
println(describe(label = "missing"))
println(describe(Int.MAX_VALUE, Int.MAX_VALUE))
}text
numbers: min=2 max=6 mean=4.0
sample: min=-5 max=5 mean=0.0
missing: empty
numbers: min=2147483647 max=2147483647 mean=2.147483647E9Порожній набір перевіряється до доступу до першої комірки та ділення. Сума використала Long; для допустимого розміру IntArray сума значень Int уміщується в цей діапазон. Перетворення суми на Double може втратити точність великих цілих, тому текст середнього не є точним раціональним числом.
Vararg зручний для невеликого набору аргументів, але не завжди найкращий інтерфейс для великої обробки даних. Розгортання може створювати копію масиву, а повторні виклики – зайві виділення пам’яті. Функція, що природно працює з уже наявним масивом, може приймати його без vararg.