Шаг 84.
Основы Kotlin.
Строки. Сравнение строк

    На этом шаге мы рассмотрим особенности выполнения такого сравнения.

    Что если игрок захочет заказать что-то, кроме 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, мы добавим в проект таверны возможность расплачиваться золотом или серебром.

    На следующем шаге мы немного поговорим о Юникоде.




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