let
возвращает значение указанного функционального блока.
Таким образом, логическое объяснение состоит в том, что <1>
возвращает null
. В этом случае все выражение base64ToBmp(str)?.let { <1> }
становится null
и будет вычисляться правая часть оператора elvis (т.е. run { <2> }
).
Очень упрощенный способ его воспроизведения:
"foo"?.let { print("<1>"); null } ?: print("<2>")
// Prints <1><2>
В зависимости от вашего фактического варианта использования может подойти apply
или also
(которые оба возвращают сам объект контекста) (обратите внимание, что для apply
ссылка на объект передается как this
вместо it
):
"foo"?.apply { print("<1>"); null } ?: print("<2>")
// Prints <1>