如果使用可空布尔值和 elvis 运算符检查检查检查失败,为什么?
If check with nullable boolean and elvis operator fails inspection check, why?
在Android Studio中我在一个函数中写了以下内容:
if (startTimes.value?.containsKey(name)?:false) {
return startTimes?.value?.get(name)
}
Android Studio 突出显示 if
的内容,并带有消息 Equality check should be used instead of elvis for nullable boolean check
的警告,并建议我将其替换为:
if (startTimes.value?.containsKey(name) == true) {
return startTimes?.value?.get(name)
}
为什么 IDE 更喜欢第二个?据我所知,它们在逻辑上是相同的。
第一步是两步。它执行空检查,然后求值。第二个直接计算值。
就个人而言,我认为第二种更容易推理。
“是 x,否则如果 x 为空则为假,为真?”
对比
“x 完全正确吗?”
除此之外,还有一些编译器试图强加给你的习语,我认为是为了让代码总体上更具可读性。如果大多数人使用相同的习语,就更容易阅读彼此的代码。
根据 true
或 false
检查可空布尔值是 "official" Kotlin idiom:
Nullable Boolean
val b: Boolean? = ...
if (b == true) {
...
} else {
// `b` is false or null
}
这里是the relevant discussion关于成语的内容,包括支持和反对的意见。
在Android Studio中我在一个函数中写了以下内容:
if (startTimes.value?.containsKey(name)?:false) {
return startTimes?.value?.get(name)
}
Android Studio 突出显示 if
的内容,并带有消息 Equality check should be used instead of elvis for nullable boolean check
的警告,并建议我将其替换为:
if (startTimes.value?.containsKey(name) == true) {
return startTimes?.value?.get(name)
}
为什么 IDE 更喜欢第二个?据我所知,它们在逻辑上是相同的。
第一步是两步。它执行空检查,然后求值。第二个直接计算值。
就个人而言,我认为第二种更容易推理。
“是 x,否则如果 x 为空则为假,为真?”
对比
“x 完全正确吗?”
除此之外,还有一些编译器试图强加给你的习语,我认为是为了让代码总体上更具可读性。如果大多数人使用相同的习语,就更容易阅读彼此的代码。
根据 true
或 false
检查可空布尔值是 "official" Kotlin idiom:
Nullable Boolean
val b: Boolean? = ... if (b == true) { ... } else { // `b` is false or null }
这里是the relevant discussion关于成语的内容,包括支持和反对的意见。