Я играю с takeIf и позволяю стандартной функции mimi c оператор if / else.
После некоторого исследования я заметил некоторое неожиданное поведение, если последний оператор в блоке let возвращает null тогда elvis будет оценен как null и вызовет showError ().
Но в некоторых случаях он работает так, как ожидалось, поскольку я написал ниже различные реализации с комментариями
val person: Person? = Person(isAdult = true)
Работает как ожидалось
if(person != null && person.isAdult) {
showPerson(person)
}
else {
showError()
}
Вопрос? Это вызовет showPerson, а затем showError, поскольку :: ShowPerson вернет null в последнем операторе
person?.takeIf { it.isAdult }
?.let { ::showPerson }
?: run { showError() }
Вопрос? Это покажет ошибку
person?.takeIf { it.isAdult }
?.let(::showPerson)
?: showError()
Работает как ожидалось
if(person != null && person.isAdult) {
showPerson(person)
hideProgressWithSuccess()
}
else {
showError()
hideProgress()
}
Вопрос? Это покажетPerson, а затем hideProgressWithSuccess, поскольку hideProgressWithSuccess является последним оператором и ничего не возвращает. Я предполагаю, что это работает так, как ожидалось, поскольку последний оператор не возвращает null
person?.takeIf { it.isAdult }
?.let { it: Person ->
showPerson(it)
hideProgressWithSuccess()
}
?: run {
showError()
hideProgress()
}
class Person(val isAdult: Boolean = true)
Явно возвращает null для проверки этого сценария
fun showPerson(person: Person): String? {
println(person)
return null
}
fun showError() {
println("Person Error")
}
fun hideProgressWithSuccess() {}
fun hideProgress() {}