当猫王操作员的 ?:
不当行为时,面临一个有趣的案例。
想象一下有这样的事情
base64ToBmp(str)?.let { <1> } ?: run { <2> }
并看到在一些旧的电话和模拟器上<1>
,<2>
代码被调用了。
<1>
显示位图
<2>
显示错误
这就像位图无法解析一样。
有人看到过这种行为吗?有逻辑上的解释吗?
let
返回指定功能块的值。
因此,合理的解释是<1>
返回null
。在这种情况下,整个表达式base64ToBmp(str)?.let { <1> }
变为null
,run { <2> }
并将评估elvis运算符(即)的右手侧。
一种非常简化的复制方式是:
"foo"?.let { print("<1>"); null } ?: print("<2>") // Prints <1><2>
取决于您的实际用例,apply
或者also
(两者都返回上下文对象本身)可能是合适的(请注意,对于apply
对象引用,是使用this
代替传递的it
):
"foo"?.apply { print("<1>"); null } ?: print("<2>") // Prints <1>