Шаг 82.
Основы Kotlin.
Строки. Работа со строками

    На этом шаге мы рассмотрим использование функции replace().

    Тот, кто пьет Dragon's Breath, не только наслаждается восхитительным вкусом, но также обретает особые навыки программирования и способность понимать и говорить на драконьем языке (DragonSpeak), древнем наречии, похожем на 1337Sp34k. Например:

  A word of advice: Don't drink the Dragon's Breath
переводится на драконий язык как
  A w0rd 0f 4dv1c3: D0n't dr1nk th3 Dr4g0n's Br34th

    Тип String включает в себя функции для манипулирования значениями строк. Чтобы добавить переводчик на драконий язык в NyetHack, воспользуйтесь функцией replace(), которая, как можно понять из ее имени, заменяет символы по заданным правилам. Функция replace() принимает регулярное выражение (подробнее о них мы расскажем в следующих шагах), определяющее символы для замены, и вызывает анонимную функцию, объявленную вами, которая определяет, какие символы чем заменить.

    Добавьте новую функцию с именем toDragonSpeak(), которая принимает фразу и возвращает ее на драконьем языке. Также добавьте саму фразу в placeOrder и вызовите toDragonSpeak() с ней.

const val TAVERN_NAME = "Taernyl's Folly"

fun main() {
    placeOrder("shandy,Dragon's Breath,5.91")
}

private fun placeOrder(menuData: String) {
    val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
    val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
    println("Madrigal speaks with $tavernMaster about their order.")
    val (type, name, price) = menuData.split(',')
    val message = "Madrigal buys a $name ($type) for $price."
    println(message)
    val phrase = "Ah, delicious $name!"
    println("Madrigal exclaims: ${toDragonSpeak(phrase)}")
}

private fun toDragonSpeak(phrase: String) =
        phrase.replace(Regex("[aeiou]")) {
            when (it.value) {
                "a" -> "4"
                "e" -> "3"
                "i" -> "1"
                "o" -> "0"
                "u" -> "|_|"
                else -> it.value
            }
}
Файл с проектом можно взять здесь.


Рис.1. Объявление функции toDragonSpeak (Tavern.kt)

    Запустите Tavern.kt. В этот раз вы заметите, что речь героя приобрела драконий акцент:

  Madrigal speaks with Taernyl about their order.
  Madrigal buys a Dragon's breath (shandy) for 5.91 
  Madrigal exclaims: Ah, d3l1c10|_|s Dr4g0n's Br34th!


Рис.2. Результат работы приложения

    В этом примере вы использовали возможности, доступные для String, чтобы сгенерировать фразу на драконьем языке.

    Версия функции replace(), которую вы использовали, принимает два аргумента. Первый аргумент - это регулярное выражение, которое определяет, какие символы вы хотите заменить. Регулярное выражение, или regex, задает шаблон для поиска нужных символов. Второй аргумент - это анонимная функция, которая определяет, какие символы и чем заменить.

    Взгляните на первый аргумент, который вы передали в replace(), то есть на регулярное выражение, определяющее символы для замены:

        phrase.replace(Regex("[aeiou]")) {
            .   .   .   .
            }

    Regex принимает аргумент с шаблоном "[aeiou]", который определяет символы для поиска и замены. Kotlin использует тот же синтаксис регулярных выражений, что и Java. Документация с его описанием выражений доступна по ссылке docs.orade.com/javase/8/docs/api/java/util/regex/Pattem.html.

    Определив, какие символы должна найти replace(), надо указать, чем эти символы заменить, объявив анонимную функцию.

private fun toDragonSpeak(phrase: String) =
        phrase.replace(Regex("[aeiou]")) {
            when (it.value) {
                "a" -> "4"
                "e" -> "3"
                "i" -> "1"
                "o" -> "0"
                "u" -> "|_|"
                else -> it.value
            }
}

    Анонимная функция получает аргумент с найденным значением, совпавшим с регулярным выражением, и возвращает новое значение для замены.

    На следующем шаге мы рассмотрим некоторые особенности использования строк.




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