gpt4 book ai didi

kotlin - 分号推理的规则是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:35:30 26 4
gpt4 key购买 nike

Kotlin provides “semicolon inference”: syntactically, subsentences (e.g., statements, declarations etc) are separated by the pseudo-token SEMI, which stands for “semicolon or newline”. In most cases, there’s no need for semicolons in Kotlin code.

这就是 grammar页说。这似乎暗示在某些情况下需要指定分号,但它没有指定它们,并且下面的语法树并没有完全说明这一点。另外我怀疑在某些情况下此功能可能无法正常工作并导致问题。

所以问题是应该在什么时候插入分号以及需要注意哪些极端情况以避免编写错误代码?

最佳答案

您只需要在编译器对您要执行的操作不明确的情况下指定分号,并且缺少分号会导致明显的编译器错误。

规则是:不用担心,也不要使用分号(除了下面的两种情况)。当你弄错时,编译器会告诉你,保证。即使您不小心添加了一个额外的分号,语法突出显示也会向您显示这是不必要的,并发出“冗余分号”警告。

分号的两种常见情况:

具有枚举列表以及枚举中的属性或函数的枚举类需要 ;在枚举列表之后,例如:

enum class Things {
ONE, TWO;

fun isOne(): Boolean = this == ONE
}

并且在这种情况下,如果你没有正确执行,编译器会直接告诉你:

Error:(y, x) Kotlin: Expecting ';' after the last enum entry or '}' to close enum class body

否则,唯一的其他常见情况是当您在同一行上执行两个语句时,可能是为了简洁起见:

myThingMap.forEach { val (key, value) = it; println("mapped $key to $value") } 

在最后一个示例中缺少分号会给你一个更神秘的错误,它会混淆你正在做的事情。很难编写一些既有效的代码,作为两个用分号分隔的语句,当分号被删除并且它们成为一个语句时也有效。

过去还有其他一些情况,例如更“匿名”的类的初始化 block { ... }在 Kotlin 1.0 之前和后来变为 init { ... }它不再需要分号,因为它更清晰。这些案例不再保留在该语言中。

对此功能的信心:

Also I have suspicions that there are some cases where this feature may not work correctly and cause problems.

该功能运行良好,没有任何证据表明该功能存在问题,多年的 Kotlin 经验也没有发现任何已知的该功能适得其反的案例。如果缺少 ; 有问题编译器会报错。

搜索我所有的开源 Kotlin 以及我们内部相当大的 Kotlin 项目,除了上述情况外,我没有找到分号——而且总数非常少。支持“不要在 Kotlin 中使用分号”作为规则的概念。

但是,您可以故意设计一个编译器不报告错误的情况,因为您创建的代码是有效的并且具有不同含义的带有和不带有分号的代码。这将如下所示(@Ruckus 答案的修改版本):

fun whatever(msg: String, optionalFun: ()->Unit = {}): () -> Unit = ...

val doStuff: () -> Unit = when(x) {
is String -> {
{ doStuff(x) }
}
else -> {
whatever("message") // absence or presence of semicolon changes behavior
{ doNothing() }
}
}

在这种情况下,doStuff 被分配了调用 whatever("message") { doNothing() } 的结果。这是 ()->Unit 类型的函数;如果您添加分号,则会为其分配功能 { doNothing() }这也是 ()->Unit 类型.所以代码在两种情况下都有效。 但我还没有看到这样的事情自然发生,因为一切都必须完美排列。 feature suggested emit keyword or ^ hat operator本来这个案例是不可能的,并且由于强烈反对意见和时间限制,它被考虑但在 1.0 之前被放弃了。

关于kotlin - 分号推理的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318457/

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