На этом шаге мы немного детализируем лямбды.
В языке Kotlin анонимные функции могут изменять и использовать переменные вне их области видимости. Это значит, что анонимная функция имеет ссылки на переменные, объявленные в области видимости, где создается она сама, как мы видели это на примере функции configureGreetingFunction() на предыдущем шаге.
Для демонстрации этого свойства анонимных функций измените runSimulation() так, чтобы она несколько раз вызывала функцию, возвращаемую из configureGreetingFunction().
. . . . fun runSimulation() { val greetingFunction = configureGreetingFunction() println(greetingFunction("Guyal")) println(greetingFunction("Guyal")) } . . . .
Рис.1. Вызов println() дважды в runSimulation() (SimVillage.kt)
Запустите SimVillage снова. Вы увидите следующий вывод:
building 6 hospitals Welcome to SimVillage, Guyal! (copyright 2021) building 7 hospitals Welcome to SimVillage, Guyal! (copyright 2021)
Рис.1. Результат работы приложения
Несмотря на то что переменная numBuildings объявлена вне анонимной функции, анонимная функция может читать ее и изменять. В данном случае значение numBuildings увеличивается с 6 до 7.
На следующем шаге мы сравним лямбды и анонимные классы.