gpt4 book ai didi

Kotlin的逻辑 'and'没有短路?

转载 作者:行者123 更新时间:2023-12-02 09:30:08 28 4
gpt4 key购买 nike

我正在关注 Kotlin 的文档 http://kotlinlang.org/docs/reference/null-safety.html#checking-for-null-in-conditions并尝试改编这个例子,

val b = "Kotlin"
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}

对于b = null的情况。在 IntelliJ Idea Kotlin 项目中,我有一个 app.kt ,其 main() 函数定义为:

fun main() {
val b = null
if (b != null && b.length > 0) {
print("String of length ${b.length}")
} else {
print("Empty string")
}
}

但是,当我运行它时,我收到两个编译错误:

Information:Kotlin: kotlinc-jvm 1.3.20 (JRE 11+28)
Information:2019-02-02 15:07 - Compilation completed with 2 errors and 0 warnings in 1 s 921 ms
/Users/kurtpeek/IdeaProjects/HelloWorld/src/app.kt
Error:(3, 24) Kotlin: Unresolved reference: length
Error:(4, 37) Kotlin: Unresolved reference: length

据我了解,即使第一个条件 b != nullfalse,编译器仍在评估 b.length。这让我感到惊讶,因为我认为第一个检查是在需要时“短路” bool 表达式并调用 b.length“安全”。

例如,在 Python 中,您可以执行以下操作:

In [1]: "foo" == "bar" and what.the.heck
Out[1]: False

即使未定义 what 也能工作,因为 and 'stops',因为 "foo" 不等于 “酒吧”

这确实是 Kotlin 的工作原理吗?缺少 Python 的“短路”功能似乎会成为一个限制。

最佳答案

Kotlin 的 &&运算符会短路(就像 Java 一样),但仅限于运行时。您遇到的是编译时错误。尤其是在将 Kotlin(或 Java)与 Python 进行比较时,需要记住的最大区别是 Kotlin 和 Java 是静态类型的并且具有编译阶段。因此,如果类型不匹配,您将收到编译错误。

让我们一次过一遍这些......

val b = "Kotlin"
if (b != null && b.length > 0) {
...
}

在这种情况下,Kotlin 将正确推断 b类型是String ,因为您明确将其设置为字符串(“Kotlin”)。我们在这里应该注意的是String类型永远不能包含 null。知道了这一点,b != null您的一部分if声明是不必要的。但是,在评估之后(始终为 true),它将评估 b.length因为bString因此有 length属性(property)。这个示例应该可以正常编译(我没有测试它)。

接下来...

val b = null
if (b != null && b.length > 0) {
...
}

这段代码无法编译,让我们看看为什么......

这段代码看起来确实相似,但有一个巨大的区别。在这种情况下,因为您刚刚设置 bnull ,Kotlin 将推断 bNothing? 。它没有关于您想要什么类型的信息b是,并且您已将其设置为 null (并且因为它是 val ,所以它始终null )。因为bnull ,它使得b可为空。

因此,鉴于此,当我们编译 b != null 时,这总是会失败,因为 b不可能不是 null 。可是等等!我们现在正在编译...当我们遇到b.length时Kotlin 将抛出编译错误,因为 Nothing?没有 length属性(property)!

本质上,通过设置bnull并且不提供类型提示,Kotlin 采用唯一的路径来推断类型 - Nothing?

关于Kotlin的逻辑 'and'没有短路?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54498548/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com