Kotlin: 'null'은 'true'와 같지 않지만 'false'도 아닙니다.

4757 단어 nullabilitykotlin

TL;DR Kotlin has the === operator for referential integrity and none of true, false or null references the same thing. Don't forget that, when comparing nullable booleans.



오늘 나는 IntelliJ의 힌트를 우연히 발견했습니다. 나는 다음과 같은 것을 쓰고 싶었다.

val potentiallyNull: Any? = null // in real world, we wouldn't know whether it's null or not
if (potentiallyNull?.equals("foo") ?: false) {
    println("not printed when null")
}


즉, potentiallyNull가 null이 아니면 "foo" 와 같은지 확인하십시오. 그렇지 않으면 false를 반환합니다.

그래서 IntelliJ는 친절하게 다음과 같이 말했습니다. Equality check should be used instead of elvis for nullable boolean check
나는 속으로 생각했다. 알았어, 그럼 좋은 힌트를 적용해보자.

내가 얻은 것은 다음과 같습니다.

if (potentiallyNull?.equals("foo") == true) {
    println("not printed when null")
}


그러나 나중에 조건을 반전시키고 싶었습니다. 그래서 순진하게 truefalse로 대체했습니다.

if (potentiallyNull?.equals("foo") == false) {
    println("print also when null")
}


불행히도 결과는 예상과 달랐습니다. 콘솔에 단일 문자가 인쇄되지 않았습니다. 무엇이 잘못되었나요?

사실, 그것은 매우 분명하지만 깨닫는 데 잠시 시간이 걸렸습니다. 물론 nulltrue 와 같지 않고 false 와 같지도 않습니다.

그래서 저는 한 발 물러서서 원래의 상태를 다시 썼습니다.

if (potentiallyNull?.equals("foo") ?: true) {
    println("print also when null")
}


IntelliJ는 다시 그것을 변경하고 평등 검사를 사용하라고 말했기 때문에 지금 얻은 것은 다음과 같습니다.

if (potentiallyNull?.equals("foo") != false) {
    println("print also when null")
}


내가 생각한 첫 번째 생각은 : ... != false... == true와 어떻게 다른가요?

그러나 다시 nulltrue 또는 false와 같지 않습니다. 따라서 비교에는 실제로 true , false 또는 none of them 의 세 가지 가능한 결과가 있습니다.

이 경우 ... != falsetrue 또는 none of them 를 의미하지만 ... != truetrue 만을 의미합니다.

Kotlin의 평등에 대한 자세한 내용은 equality에서 공식 문서를 읽는 것이 좋습니다.

대체로 그때가 가장 빛나는 순간은 아니었지만 다른 사람들도 그 순간을 우연히 발견할 수 있다고 생각했습니다. 당신이 그것을 좋아 바랍니다.

좋은 웹페이지 즐겨찾기