我发现在猫王方块下方的情况下 实际上是指外部可空性检查
val outer : String? = ""
val inner : String? = null
outer?.let {
inner?.let {
// do something
}
} ?: System.out.println("Outer else")
其他
将Elvis分支添加到内部可空性检查中的行为符合预期:
outer?.let {
inner?.let {
// do something
} ?: System.out.println("Inner else")
} ?: System.out.println("Outer else")
其他
这是Kotlin的错误吗?
答案 0 :(得分:3)
该代码的行为符合预期。在您的情况下,?:
运算符的左操作数是
outer?.let {
inner?.let {
// do something
}
}
outer
不为null,因此将执行外部let
块。 inner
为空,因此将不调用第二个let
,并且外部块的返回值为空。这样会使整个表达式求值为空,因此?:
运算符的右侧操作数将被执行。
在第二个示例中,外部块的值计算为
inner?.let {
// do something
} ?: System.out.println("Inner else")
由于inner
为null,因此将调用?:
的右侧操作数并将其求值为Unit
,这就是外部块的值。
答案 1 :(得分:1)
这不是Kotlin错误。 a?.let { expr }
的评估结果是否为空
将事物拼凑在一起,整个表达式的评估如下:
inner?.let { expr }
的计算结果为空,因为inner
为空(上述情况1)outer?.let { ... }
的计算结果为空(上面的情况2),因为括号内的内容计算为空(项目符号11。)?:
运算符的剩余值为null(项目符号12),因此将计算外部elvis表达式。在inner?.let { }
之后添加猫王时,outer?.let { }
不再返回null,而是返回Unit
,因此不评估外部猫王。清楚吗?
答案 2 :(得分:1)
Elvis运算符不仅用于可空性检查,还将评估语句的结果,如果null
,它将运行第二个条件。
换句话说,如果inner?.let{}
的值为null
(如果inner
为空或let
块返回空),则将得到打印{{1 }}。
将Elvis运算符添加到内部块中进一步确认了这一点,因为该表达式中的某些值似乎为空。