На этом шаге мы рассмотрим пример использования этой функции.
Безопасный вызов позволяет вызвать функцию с типом, поддерживающим 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.
На следующем шаге мы рассмотрим использование оператора !!..