На этом шаге мы рассмотрим использование расширения.
Теперь применим новые знания для улучшения NyetHack. Откройте проект, а в нем файл Tavern.kt.
Tavern.kt содержит повторяющуюся цепочку вызовов функций для нескольких коллекций: shuffled().first().
. . . . fun main() { . . . . (0..9).forEach { val first = patronList.shuffled().first() val last = lastName.shuffled().first() val name = "$first $last" uniquePatrons += name } println(uniquePatrons) var orderCount = 0 while (orderCount <= 9) { placeOrder(uniquePatrons.shuffled().first(), menuList.shuffled().first()) orderCount++ } } . . . .
Объявите новое расширение с именем random в начало Tavern.kt.
. . . . private fun <T> Iterable<T>.random(): T = this.shuffled().first() . . . .
Рис.1. Добавление private-расширения random (Tavern.kt)
Комбинация shuffled() и first() вызывается для списков (например, menuList) и множества uniquePatrons. Чтобы сделать расширение доступным для обоих типов, в роли принимающего типа следует указать их супертип: Iterable.
Теперь заменим прежние вызовы shuffled().first() вызовом функции-расширения random.
. . . . fun main() { . . . . (0..9).forEach { val first = patronList.random() val last = lastName.random() val name = "$first $last" uniquePatrons += name } println(uniquePatrons) var orderCount = 0 while (orderCount <= 9) { placeOrder(uniquePatrons.random(), menuList.random()) orderCount++ } } . . . .
Рис.2. Использование расширения random() (Tavern.kt)
На следующем шаге мы рассмотрим объявление файла-расширения.