gpt4 book ai didi

kotlin - 为什么非详尽的when 表达式会导致编译器错误,而when 语句却不会?

转载 作者:行者123 更新时间:2023-12-03 08:27:25 27 4
gpt4 key购买 nike

例如,如果我有一个密封类(class)

sealed class Result {
object Success: Result()
object Failure: Result()
}

为什么when语句在不详尽的情况下可以编译,但when表达式却不能编译?

        when(getResult()) { //  `when` doesn't show a red squiggly, compiles file
Result.Success -> {}
}

val result = when(getResult()) { // <--- when shows a red squiggly, doesn't compile
Result.Success -> {}
}

要使其成为when语句的编译错误,只需调用详尽的扩展属性:

        when(getResult()) { //  `when` NOW shows a red squiggly            
Result.Success -> {}
}.exhaustive

我正在看YouTube: Sealed classes - Kotlin Vocabulary他们建议使用以下代码来克服这个问题,但我想了解为什么存在差异。这应该可以帮助我理解为什么以下 Kotlin 通用扩展属性可以解决问题。

val <T> T.exhaustive: T
get() = this

编辑:感谢 Tenfour04,我知道原因。我只是不知道为什么这个详尽扩展函数能发挥它的作用。

最佳答案

如果结果不是Success,您希望分配什么结果?表达式的要点是评估某物。如果在某些情况下它不能计算出某些值,那么它就像一个具有不返回任何内容的分支的函数。

语句不必返回任何内容,因此没有理由强制它返回。它就像 C 或 Java 等语言中没有 else 分支的 if 语句一样。它适用于您只想在特定条件下执行特定任务的情况。

通过对 when() 的结果调用某些内容(在本例中为属性),可以强制编译器将 is 视为表达式而不是语句。语句不会评估任何内容,因此您无法对其不存在的结果调用任何内容。

这种强制详尽陈述的方式的缺点是它创建了一个属性,该属性将出现在绝对所有内容的自动完成中。您也可以使用空作用域函数来标记它,但这看起来有点难看。

when(getResult()) {
Result.Success -> {}
}.run { }

关于kotlin - 为什么非详尽的when 表达式会导致编译器错误,而when 语句却不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66232871/

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