Шаг 80.
Основы Kotlin.
Строки. Извлечение подстроки (substring)

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

    Чтобы разрешить посетителям делать заказы, мы рассмотрим два способа извлечения одной строки из другой: substring и split.

substring

    Ваше первое задание: написать функцию, которая позволяет игроку сделать заказ через трактирщика. Откройте 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 перечислены экранированные последовательности (состоящие из \ и символа, который надо экранировать) и их значение для компилятора.

Таблица 1. Управляющие последовательности
Управляющие последовательности Значение
\t Символ табуляции
\b Символ забоя (backspace)
\n Символ перевода строки
\r Символ возврата каретки
\" Символ двойной кавычки
\' Символ одиночной кавычки
\$ Символ доллара
\u Символ Юникода

    Как только вы получили индекс первого апострофа в строке, можно вызвать substring, которая вернет новую строку из существующей по заданным параметрам:

    val tavernMaster = TAVERN_NAME.substring(0 until indexOfApostrophe)
Функция substring() принимает IntRange (тип, представляющий диапазон целочисленных значений), который определяет индексы извлекаемых символов (вспомните, что until создает интервал, исключающий указанную верхнюю границу). В результате переменной tavernMaster будет присвоена строка, включающая символы от начала строки TAVERN_NAME до первого апострофа, другими словами, "Taernyl".

    Наконец, вы использовали шаблонную строку, чтобы вывести значение переменной tavernMaster, добавив префикс $:

    println("Madrigal speaks with $tavernMaster about their order.")

    На следующем шаге мы рассмотрим функцию split().




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