На этом шаге мы рассмотрим особенности выполнения такого сравнения.
Что если игрок захочет заказать что-то, кроме Dragon's Breath? Функция toDragonSpeak() все равно будет вызвана, это нежелательно.
Добавьте условие в функцию placeOrder(), чтобы пропустить вызов toDragonSpeak(), если игрок заказал что-то другое, не Dragon's Breath.
const val TAVERN_NAME = "Taernyl's Folly" fun main() { // placeOrder("shandy,Dragon's Breath,5.91") placeOrder("elixir,Shirley's Temple,4.12") } 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 = if (name == "Dragon's Breath") { "Madrigal exclaims: ${toDragonSpeak("Ah, delicious $name!")}" } else { "Madrigal says: Thanks for the $name." } println(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. Сравнение строк в placeOrder() (Tavern.kt)
Закомментируйте заказ Dragon's Breath к функции main() - мы к нему еще вернемся - и добавьте новый вызов placeOrder(), но с другими данными (рисунок 1).
Запустите Tavern.kt. Вы увидите следующий вывод:
Madrigal speaks with Taernyl about their order. Madrigal buys a Shirley's Temple (elixir) for 4.12 Madrigal says: Thanks for the Shirley's Temple.
Рис.2. Результат работы приложения
Вы проверили структурное равенство переменной name и значения "Dragon's Breath", используя оператор структурного равенства ==. Вы уже видели этот оператор, когда мы сравнивали числовые значения. При применении к строкам он сравнивает их посимвольно, то есть считает строки равными, если они содержат одни и те же символы, следующие в одном и том же порядке.
Есть еще один способ проверить равенство двух переменных: равенство ссылок, которое проверяет, хранят ли две переменные ссылку на один и тот же экземпляр типа, - другими словами, проверяет тот факт, что две переменные указывают на один и тот же объект. Равенство ссылок проверяется с помощью ===.
Сравнение ссылок не всегда дает нужный результат. Обычно не важно, что строки являются разными экземплярами, а важно то, что они содержат или не содержат одинаковые символы в одинаковом порядке (то есть два независимых экземпляра имеют или не имеют одинаковую структуру).
Если вы знакомы с Java, то знаете, что поведение оператора == при сравнении строк отличается от ожидаемого, потому что в Java оператор == используется для сравнения ссылок. В Java строки сравниваются с помощью функции equals().
В приведенных шагах вы научились работать со строками в Kotlin. Увидели, как использовать функцию indexOf(), чтобы узнать индекс определенного символа, и регулярные выражения - для поиска по заданным шаблонам. Вы познакомились с синтаксисом деструктуризации, который позволяет объявить множество переменных и присвоить им значения всего лишь одним выражением, а также узнали, как Kotlin использует оператор структурного сравнения ==.
На очереди у нас числа в Kotlin, мы добавим в проект таверны возможность расплачиваться золотом или серебром.
На следующем шаге мы немного поговорим о Юникоде.