На этом шаге мы рассмотрим использование функций высшего порядка.
Как и любой другой тип, функциональный тип также может быть возвращаемым типом. Это значит, что можно объявить функцию, которая возвращает функцию.
В SimVillage объявите функцию configureGreetingFunction(), которая настраивает аргументы для лямбды в переменной greetingFunction, а затем генерирует и возвращает лямбду, готовую к использованию.
fun main() { runSimulation() } fun runSimulation() { val greetingFunction = configureGreetingFunction() println(greetingFunction("Guyal")) } fun configureGreetingFunction(): (String) -> String { val structureType = "hospitals" var numBuildings = 5 return { playerName: String -> val currentYear = 2021 numBuildings += 1 println("Adding $numBuildings $structureType") "Welcome to SimVillage, $playerName! (copyright $currentYear)" } }
Рис.1. Добавление функции configureGreetingFunction()
Представьте, что configureGreetingFunction() - это такая "фабрика функций", которая настраивает другую функцию. Она объявляет необходимые переменные и собирает их в лямбду, которую затем возвращает в точку вызова, то есть в функцию runSimulation.
Запустите SimVillage.kt снова, и вы увидите, сколько было построено больниц:
Adding 6 hospitals Welcome to SimVillage, Guyal! (copyright 2021)
Рис.2. Результат работы приложения
numBuildings и structureType - локальные переменные, объявленные внутри configureGreetingFunction(), и обе используются в лямбде, возвращаемой из configureGreetingFunction(), хотя объявляются во внешней функции, которая возвращает лямбду. Это возможно, потому что лямбды в Kotlin - это замыкания. Они замыкают переменные из внешней области видимости, в которой были определены. Более подробно замыкания будут рассмотрены на следующем шаге.
Функция, которая принимает или возвращает другую функцию, также называется функцией высшего порядка. Терминология позаимствована из той же математической области, что и лямбда. Функции высшего порядка используются в функциональном программировании, с которым мы познакомимся позже.
Итак, вы узнали, что такое лямбды (анонимные функции), как они используются для изменения поведения функций из стандартной библиотеки Kotlin и как объявлять свои собственные лямбды. Кроме того, вы узнали, что функции можно использовать точно так же, как значения любого другого типа, передавать их в аргументах и возвращать из других функций. В следующих шагах мы посмотрим, как Kotlin помогает предотвратить ошибки при программировании, поддерживая пустое значение в системе типов. Также мы вернемся к работе над NyetHack и построим таверну.
На следующем шаге мы рассмотрим более подробно лямбды Kotlin.