На этом шаге мы рассмотрим назначение и использование этой функции.
Меню таверны будет представлено строкой, в которой через запятую перечисляются: вид напитка, название, цена (в монетах). Например:
shandy,Dragon's Breath,5.91
Ваше следующее задание - добавить в функцию placeOrder() возможность принимать данные из меню таверны и выводить название, тип и цену напитка, заказанного посетителем. Измените объявление placeOrder(), добавив прием данных, и передайте ей данные из меню в точке вызова placeOrder().
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.") }
Рис.1. Передача информации о таверне в placeOrder (Tavern.kt)
Далее, для извлечения отдельных компонентов меню воспользуемся функцией split(), которая разбивает строку на подстроки по заданному разделителю. Добавьте split() в placeOrder().
. . . . 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 data = menuData.split(',') val type = data[0] val name = data[1] val price = data[2] val message = "Madrigal buys a $name ($type) for $price." println(message) }
Рис.2. Разделение данных меню (Tavern.kt)
Функция split() принимает символ-разделитель и возвращает список подстрок без разделителя. (Списки, с которыми мы познакомимся позже, хранят последовательности элементов.) В нашем случае split() возвращает список строк в порядке их следования в оригинальной строке. Вы используете индексы в квадратных скобках, называемые оператором индексированного доступа, чтобы извлечь первую, вторую и третью строки из списка и присвоить их переменным type, name и price.
Наконец, как и раньше, вы включаете строки в сообщение, используя интерполяцию строк.
Запустите Tavern.kt. Вы увидите заказ, включающий напиток, его тип и цену.
Madrigal speaks with Taernyl about their order. Madrigal buys a Dragon's Breath (shandy) for 5.91.
Так как split() возвращает список, для нее поддерживается упрощенный синтаксис, который называется деструктуризацией. Деструктуризация - это возможность объявить и инициализировать сразу несколько переменных. Замените отдельные операции присваивания в placeOrder(), использовав синтаксис деструктуризации.
. . . . 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) }
Рис.3. Деструктуризация данных из меню (Tavern.kt)
Деструктуризация часто помогает упростить присваивание значений сразу нескольким переменным. В любом случае, когда результат - это список, можно использовать синтаксис деструктуризации. Кроме списков (тип List), деструктурирующее присваивание поддерживается также для ассоциативных массивов (тип Map) и пар (тип Pair) и для классов данных.
Запустите Tavern.kt еще раз. Результаты должны быть такими же.
На следующем шаге мы рассмотрим работу со строками.