Kotlin-猫王操作员的不良行为

时间:2019-10-10 14:05:52

标签: android kotlin kotlin-android-extensions

面对Elvis Operator ?:行为不当的有趣情况。

想象一下有这样的东西

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

看到在一些旧的电话和模拟器<1><2>上已调用了代码。

  • <1>正在显示位图

  • <2>显示错误

这就像位图无法解析一样。

有人看到过这种行为吗?有逻辑上的解释吗?

2 个答案:

答案 0 :(得分:6)

let返回指定功能块的值。

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

一种非常简化的复制方式是:

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

根据您的实际用例,applyalso(都返回上下文对象本身)可能是合适的(请注意,对于apply,对象引用以{{ 1}},而不是this

it

答案 1 :(得分:2)

@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>