- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
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/
;用作语句分隔符,所以放置多个;在语句的末尾很好,因为它只是添加了空语句。 我遇到了这个有多个 ; 的代码最后但删除它们会导致错误: $line =~s;[.,]$;;; 应该与 $line =~s;
当使用自动完成来填充方法参数时,大多数情况下最后应该有一个分号。 似乎必须有一些键盘快捷键可以在最后输入分号(也可能是换行符),但我找不到它! 谢谢。 编辑 : 也许问题不清楚,当完成一个自动完成方法
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我知道我不应该在循环后放置分号。但我正在学习,不小心插入了一个。我想确切地知道我的错误到底发生了什么。所以下次发生类似的事情时,我就知道错误的根源。 在下面的代码中,在这部分代码中: triangul
我想拆分我的查询,但没有得到完全符合我要求的答案。 我的字符串如下: select 1;select \\2; select 3\\;copy customer from 's3://mybucket
VBA 中带有 Debug.Print 语句的分号 ( ; ) 的实际值/含义是什么? 我经常使用它,但对它没有真正的了解,我所知道的是它不等于 vbTab 常量,因为间距不一样。 IE。 Debug
我需要从 HTML 中的 javascript 代码获取分配的变量名称和值。 例如有html代码: ~~ contents var value1 = 55;var value2= 27;
我正在用 JSFiddle 校对这个函数,它说第二行缺少分号,但是我无法确定它会去哪里。 function debtSpiral() { var debtID = setInterval(debt
给定一个使用 ; 策略的有效 Coq 证明,是否有一个通用公式可以将其转换为用 . 替换 ; 的有效等效证明;? 许多 Coq 证明使用 ; 或战术排序策略。作为初学者,我想观察各个步骤的执行,因此我
我被困在工作中,电脑被锁定。但我正在尝试练习我的 Scala。我正在使用 Ideone.com,因为我什至无法安装 scalac... 无论如何这不是编译: class DPt(var name: S
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
考虑这些文件名。 ; f - Copy.txt ;f.txt f - Copy ;- Copy.txt f - Copy.txt 我有这段代码可以解析任何文件中的 & 符号,答案是:Drag and
为什么带有验证器(Mozilla 或 JSlint)的 Aptana 会提示这段代码: var collectionOfValues = { key0 : value0; key1 :
有什么方法可以绑定(bind); (\059) 到 tmux 中的命令? 默认情况下,它绑定(bind)到最后一个 Pane ;但是,我想将其重新绑定(bind)到 select-pane -R。 我
我有一个 Java 字符串,它实际上是一个 SQL 脚本。 CREATE OR REPLACE PROCEDURE Proc AS b NUMBER:=3; c
我有一个 python 字符串: names = "John, Paul; Sally/Frank" 我想用 , 分割字符串;/.我试过: names.split(",") 但我不确定如何通过所有分隔
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
在声明一组变量时使用逗号而不是分号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我一直在尝试并查看各种命令,但似乎无法找到正确的语法; 我想合并两个 ls 命令的输出,除以 ;(分号)并将输出写入文件。 我的 ls 命令是: ls *.lst ls -d -1 $PWD/*.ls
在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话)。 例如: var foo = 'bar', bar = 'foo'; 对比 var foo = 'bar'; var bar =
我是一名优秀的程序员,十分优秀!