Я был удивлен сегодня, узнав, что это восприятие явно идиоматического кода завершается неудачей:
class QuickTest {
var nullableThing: Int? = 55
var nullThing: Int? = null
@Test
fun `test let behaviour`() {
nullableThing?.let {
print("Nullable thing was non-null")
nullThing?.apply { print("Never happens") }
} ?: run {
fail("This shouldn't have run")
}
}
}
Это происходит потому, что в сочетании с неявным возвратом nullThing?.apply{...}
передает null в let, и, следовательно, в оператор elvisоценивает в ноль и запускает второй блок.
Это довольно ужасно обнаружить.Есть ли у нас подходящая альтернатива помимо обычной if/else
без этой ловушки?