Kotlin .let {} null safety presumably false 错误

Kotlin .let {} null safety presumably false error

使用 .let { } 函数时,我注意到在执行以下操作时:

bucket?.assignedVariantName.let {
        bucket?.determineVariant()  <-- guarantee safety for bucket
}

在这种情况下,您必须保证存储桶的安全,即 bucket?.bucket!!,而使用 ?.let 已经保证了空安全,然后我在执行以下操作时注意到:

bucket?.assignedVariantName?.let { <-- added safety check for property 
        bucket.determineVariant()  <-- doesn't need to guarantee safety for bucket
}

虽然在桶的 属性 上使用 let 而不是直接在桶上使用,但我想知道这是故意的还是 Kotlin 插件中的错误(在这种情况下,我在 Android 中遇到了这个工作室)

其他信息是,在这种情况下,存储桶是 local val,而 assignedVariantName 是可为空的变量。

val bucket: T? = ...

这是预期的行为。 .let { ... } function 定义为

inline fun <T, R> T.let(block: (T) -> R): R = block(this)

T可以是可空类型,let可以在空接收者上调用,null.let { }是有效代码。

现在看看这两个调用:

  • bucket?.assignedVariantName.let { ... }

    这里,无论接收者bucket?.assignedVariantName是否为null,总是调用let

    有一种可能的情况是bucket?.assignedVariantName为null,因为bucket为null——那么null只是传递给let,这肯定是不安全的在 let 块中使用 bucket

    (runnable example of the case)

  • bucket?.assignedVariantName?.let { ... }

    在这种情况下,只有当接收者bucket?.assignedVariantName不为空时才调用let,要求bucket不为空且其assignedVariantName不为空。此要求使得在 let 块内使用 bucket 是安全的。