На этом шаге мы рассмотрим назначение и использование этой функции.
Чтобы разрешить посетителям делать заказы, мы рассмотрим два способа извлечения одной строки из другой: substring и split.
Ваше первое задание: написать функцию, которая позволяет игроку сделать заказ через трактирщика. Откройте Tavern.kt в проекте NyetHack и добавьте переменную для названия таверны, а также функцию placeOrder.
Внутри placeOrder используйте функции для String indexOf и substring, чтобы извлечь имя трактирщика из строки TAVERN_NAME и вывести ее. (Мы подробно разберем функцию placeOrder после того, как допишем код.) Также уберите старый код определения названия напитка из прошлого упражнения. В таверне будут не только напитки. Да и к тому же Buttered Ale уже давно вне закона в королевстве.
const val TAVERN_NAME = "Taernyl's Folly" fun main() { placeOrder() } private fun placeOrder() { val indexOfApostrophe = TAVERN_NAME.indexOf('\'') val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe) println("Madrigal speaks with $tavernMaster about their order.") }
Рис.1. Извлечение имени трактирщика (Tavern.kt)
Запустите Tavern.kt. Вы увидите вывод:
Madrigal speaks with Taernyl about their order.
Давайте подробно разберем, как placeOrder извлекает имя трактирщика из названия таверны.
Сначала вызовем функцию indexOf(), чтобы получить индекс первого апострофа в строке:
val indexOfApostrophe = TAVERN_NAME.indexOf('\'')
Индекс - это целое число, соответствующее позиции символа в строке. Первый символ имеет индекс 0. Второй символ имеет индекс 1, следующий - 2 и т. д.
Тип Char, значения которого определяются в одиночных кавычках, отождествляет отдельные символы в строке. Передавая Char в indexOf, мы сообщаем функции, что она должна найти первый экземпляр Char и вернуть его индекс. Мы передали в indexOf аргумент '\'', поэтому indexOf будет сканировать строку, пока не найдет такое же значение, а затем вернет индекс апострофа.
Зачем нужен \ в аргументе? Апостроф - это также и одиночная кавычка. Если написать ''', то компилятор посчитает апостроф в середине одиночной кавычкой, закрывающей определение пустого символа. Надо сказать компилятору о том, что мы имеем в виду символ апострофа, и для этого используем экранирующий символ \, который отменяет специальное значение некоторых символов для компилятора.
В таблице 1 перечислены экранированные последовательности (состоящие из \ и символа, который надо экранировать) и их значение для компилятора.
Управляющие последовательности | Значение |
---|---|
\t | Символ табуляции |
\b | Символ забоя (backspace) |
\n | Символ перевода строки |
\r | Символ возврата каретки |
\" | Символ двойной кавычки |
\' | Символ одиночной кавычки |
\$ | Символ доллара |
\u | Символ Юникода |
Как только вы получили индекс первого апострофа в строке, можно вызвать substring, которая вернет новую строку из существующей по заданным параметрам:
val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
Наконец, вы использовали шаблонную строку, чтобы вывести значение переменной tavernMaster, добавив префикс $:
println("Madrigal speaks with $tavernMaster about their order.")
На следующем шаге мы рассмотрим функцию split().