Kotlin - Elvis 运算符的不当行为

Kotlin - Elvis Operator misbehavior

Elvis Operator ?: 不当行为时遇到了一个有趣的案例。

想象一下这样的事情

base64ToBmp(str)?.let { <1> } ?: run { <2> }

并看到在一些旧手机和模拟器上调用了 <1><2> 代码。

这就像位图解析失败一样。

有人见过这样的行为吗?有合理的解释吗?

let returns指定功能块的值。

所以合乎逻辑的解释是<1> returns null。在这种情况下,整个表达式 base64ToBmp(str)?.let { <1> } 变为 null 并且 elvis 运算符的右侧(即 run { <2> })将被计算。

一种非常简单的复制方法是:

"foo"?.let { print("<1>"); null } ?: print("<2>")
// Prints <1><2>

根据您的实际用例,apply or also(return 上下文对象本身)可能是合适的(请注意,对于 apply,对象引用作为 this 而不是 it):

"foo"?.apply { print("<1>"); null } ?: print("<2>")
// Prints <1>

@Marvin 的回答是正确的,如果你想重现这个场景你可以试试这段代码:

fun main() {
    fun someMethod(param: String?) = param

    fun letBlock(param: String): String? {
        println("<1>")
        return null
    }

    someMethod("some param")?.let(::letBlock) ?: run {
        println("<2>")
    }
}

输出为:

<1>
<2>