带磨合kotlin的Elvis操作员

带磨合kotlin的Elvis操作员,kotlin,Kotlin,我在这种情况下有点麻烦 a?.let { b?.let { } }?: run { } 问题是,如果“b”为null,则执行run块,即使elvis操作符正在引用“a”let。 我已经尝试使用“apply”而不是“run”,同样的情况也发生了原因是let函数返回其最后一个表达式是什么。如果最后一个表达式的计算结果为null(如b?.let如果b为null或该内部let的最后一行计算结果为null),则将计算Elvis运算符的第二部分 解决方案是永远不要使用Elvis运算符跟踪范围函数调

我在这种情况下有点麻烦

a?.let {
    b?.let { }
}?: run { }
问题是,如果“b”为null,则执行run块,即使elvis操作符正在引用“a”let。
我已经尝试使用“apply”而不是“run”,同样的情况也发生了

原因是
let
函数返回其最后一个表达式是什么。如果最后一个表达式的计算结果为null(如
b?.let
如果
b
为null或该内部
let
的最后一行计算结果为null),则将计算Elvis运算符的第二部分

解决方案是永远不要使用Elvis运算符跟踪范围函数调用。它也可以使用
而不是
let
,因为它不会返回lambda结果,但它仍然是一个看起来很钝的代码,很难读取。这是一个如此丑陋的模式来使用它是多么可笑

对于这种特殊情况,我将按照如下方式重构您的代码

val a = a
if (a != null) {
    b?.let {
        //...
    }
} else {
    //...
}

我们需要看看在
let
中发生了什么,因为这一切都取决于此。此外,如果
a
为空,则
运行块将始终执行,并完全忽略
b
。顺便说一句,如果
a
不为null,而
b
为null,那么
let
将始终返回null,从而执行
run块?我必须使用“if else”吗?你说过这就是你的想法,但看看我的最后一句话:
如果a不为null,b为null,那么let将始终返回null,从而执行run块
。它描述了你的跑步,a不是空的,b是空的,因此执行跑步。在你编辑之前,我说了“我就是这么想的”,对不起