На этом шаге мы рассмотрим использование функции 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 } }
Анонимная функция получает аргумент с найденным значением, совпавшим с регулярным выражением, и возвращает новое значение для замены.
На следующем шаге мы рассмотрим некоторые особенности использования строк.