Шаг 215.
Основы Kotlin.
Расширения. Извлечение в расширения

    На этом шаге мы рассмотрим использование расширения.

    Теперь применим новые знания для улучшения 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.


Можно воспользоваться функцией поиска и замены, привязанной к комбинации клавиш Command+R [Ctrl+R]. Но будьте внимательны - не замените вызов shuffled().first() внутри самого расширения.
.   .   .   .
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)

    На следующем шаге мы рассмотрим объявление файла-расширения.




Предыдущий шаг Содержание Следующий шаг