Kotlin,执行嵌套可空性检查时调用了错误的Elvis语句

时间:2019-03-15 03:15:24

标签: kotlin

我发现在猫王方块下方的情况下 实际上是指外部可空性检查

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的错误吗?

3 个答案:

答案 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 }的评估结果是否为空

  1. a为空,或
  2. expr计算为空

将事物拼凑在一起,整个表达式的评估如下:

  1. inner?.let { expr }的计算结果为空,因为inner为空(上述情况1)
  2. 所以outer?.let { ... }的计算结果为空(上面的情况2),因为括号内的内容计算为空(项目符号11。)
  3. 因此,由于?:运算符的剩余值为null(项目符号12),因此将计算外部elvis表达式。

inner?.let { }之后添加猫王时,outer?.let { }不再返回null,而是返回Unit,因此不评估外部猫王。清楚吗?

答案 2 :(得分:1)

Elvis运算符不仅用于可空性检查,还将评估语句的结果,如果null,它将运行第二个条件。

换句话说,如果inner?.let{}的值为null(如果inner为空或let块返回空),则将得到打印{{1 }}。

将Elvis运算符添加到内部块中进一步确认了这一点,因为该表达式中的某些值似乎为空。