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
。
bucket?.assignedVariantName?.let { ... }
在这种情况下,只有当接收者bucket?.assignedVariantName
不为空时才调用let
,要求bucket
不为空且其assignedVariantName
不为空。此要求使得在 let
块内使用 bucket
是安全的。
使用 .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
。bucket?.assignedVariantName?.let { ... }
在这种情况下,只有当接收者
bucket?.assignedVariantName
不为空时才调用let
,要求bucket
不为空且其assignedVariantName
不为空。此要求使得在let
块内使用bucket
是安全的。