У вас уже есть ответы в комментариях, но просто чтобы объяснить суть ?
...
Kotlin позволяет вам делать нулевые безопасные вызовы обнуляемых переменных и свойств, добавляя ?
перед вызовом. Вы также можете связать это, выполнив
nullableObject?.someProperty?.someFunction()
который оценивает nullableObject
, и если он не равен нулю, он оценивает следующий бит, в противном случае все выражение оценивается как null
. Если какая-либо часть цепочки оценивается как null, все выражение возвращает null.
Таким образом, у него есть этот эффект короткого замыкания, и вы можете использовать оператор elvis if null для создания значения по умолчанию, если вы не можете оценить всю цепочку до ненулевого результата:
nullableObject?.nullableProperty?.someFunction() ?: defaultAction()
и как только вы введете нулевую проверку в цепочку, вам нужно будет добавлять ее для каждого последующего вызова - она в основном распространяет либо результат предыдущего бита, либо null
, который он разрешил, поэтому на каждом шаге есть нулевая проверка
Блок let
- это просто функция области видимости - вы используете его для значения, поэтому вы можете запустить некоторый код, используя это значение в качестве параметра или получателя (переменная или this
в основном). Он также имеет побочный эффект создания новой временной локальной переменной, содержащей это значение, поэтому, если исходное значение равно var
, не имеет значения, изменится ли это значение, потому что ваш let
код больше не ссылается на эту переменную.
Так что это полезно для выполнения нулевых проверок один раз, не беспокоясь о том, что базовое значение может стать нулевым, пока вы что-то с ним делаете:
nullableVar?.let { it.definitelyIsNotNull() }
и компилятор распознает это и умно преобразует его в ненулевой тип. Проверка if (nullableVar != null)
не может гарантировать, что nullableVar
не будет нулевым к моменту выполнения следующей строки.
person
cactustictacs
schedule
15.11.2020
let
не делает то, что вы думаете. Это «функция области действия», то есть функция, используемая для выполнения блока кода в другой области действия. Это не имеет ничего общего сnull
. Оператор Kotlin nullsafe выполняет вызовы методов для ссылки при условии, что эта ссылка не равна нулю. Итак, комбинируя дваx?.let{ ...}
, вы выполняете блок кода в том случае, если цель не равна нулю. - person Boris the Spider   schedule 15.11.2020run
илиapply
- person a_local_nobody   schedule 15.11.2020let
,run
,apply
иalso
- четыре функции области видимости Kotlin. - person Boris the Spider   schedule 15.11.2020let{}
ничего не меняет в переменной / объекте, в котором вы его используете, но если вы используете?let{}
, то вы имеете в виду ненулевой экземпляр переменной / объекта, поэтому, просто используяlet{}
, вы просто используете та же переменная / объект, который все еще может быть нулевым - person a_local_nobody   schedule 15.11.2020use
иwith
:) - person Animesh Sahu   schedule 15.11.2020