面对Elvis Operator ?:
行为不当的有趣情况。
想象一下有这样的东西
base64ToBmp(str)?.let { <1> } ?: run { <2> }
看到在一些旧的电话和模拟器<1>
和<2>
上已调用了代码。
<1>
正在显示位图
<2>
显示错误
这就像位图无法解析一样。
有人看到过这种行为吗?有逻辑上的解释吗?
答案 0 :(得分:6)
let
返回指定功能块的值。
因此,逻辑解释是<1>
返回null
。在这种情况下,整个表达式base64ToBmp(str)?.let { <1> }
变为null
,并且将计算elvis运算符的右侧(即run { <2> }
)。
一种非常简化的复制方式是:
"foo"?.let { print("<1>"); null } ?: print("<2>")
// Prints <1><2>
根据您的实际用例,apply
或also
(都返回上下文对象本身)可能是合适的(请注意,对于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>