Шаг 67.
Основы Kotlin.
Null-безопасность и исключения. Null-безопасность. Использование безопасного вызова с let()

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

    Безопасный вызов позволяет вызвать функцию с типом, поддерживающим null, но что если вы хотите выполнить дополнительную работу, например, ввести новое значение или вызвать другие функции, если значение переменной отлично от null? Один из способов достичь этого - использовать оператор безопасного вызова с функцией let(). Эта функция вызывается со значением, и суть в том, чтобы разрешить объявлять переменные для выбранной области видимости.

    Так как let() создает свою область видимости, можно использовать безопасный вызов с let(), чтобы охватить несколько выражений, которые требуют переменной с типом, не поддерживающим null. В свое время мы поговорим об этом подробнее, а сейчас изменим определение beverage, чтобы увидеть, как это делается.

fun main() {
    var beverage = readLine()?.let {
        if (it.isNotBlank()) {
            it.capitalize()
        } else {
            "Buttered Ale"
        }
    }
//    beverage = null
    println(beverage)
}
Файл с проектом можно взять здесь.


Рис.1. Использование let с оператором безопасного вызова (Tavern.kt)

    Здесь вы объявляете beverage как переменную с типом, поддерживающим null. Но в этот раз присваиваете значение как результат безопасного вызова let(). Когда beverage имеет значение, отличное от null, вызывается let() и выполняется тело анонимной функции, переданной в let(): проверяются входные данные из readLine() и определяется, было ли введено что-то пользователем; если да, то первая буква становится прописной, а если нет, то возвращается запасное название напитка - "Buttered Ale". Функции isNotBlank() и capitalize() требуют, чтобы аргумент имел тип, не поддерживающий null, что обеспечит функция let().

    Функция let() поддерживает несколько соглашений, двумя из которых вы воспользовались здесь. Во-первых, в объявлении beverage вы использовали ключевое слово it, с которым познакомились чуть позже. Внутри let() ключевое слово it ссылается на переменную, для которой вызвана let(), и гарантирует, что она имеет тип, не поддерживающий null. Вы вызываете isNotBlank() и capitalize() с it - формой beverage, не поддерживающей null.

    Второе соглашение let() не так очевидно: let() возвращает результаты в неявной форме, поэтому вы можете (и должны) присвоить этот результат переменной сразу после вычисления вашего выражения.

    Запустите Tavern.kt и задайте значение null переменной beverage, просто нажав клавишу Enter.


Рис.2. Результат работы приложения при заданном значении null

    Когда beverage имеет значение, отличное от null, вызывается let(), появляется прописная буква и выводится результат.


Рис.3. Результат работы приложения при заданном значении, отличном от null

    Когда beverage имеет значение null, функция let() не вызывается, и в beverage остается null.

    На следующем шаге мы рассмотрим использование оператора !!..




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