Kotlin:为什么我不能在循环卫士中做一个任务?

为什么这个语法无效? IntelliJ报告的错误是在这样的上下文中只允许表达式(第2行)。 我想知道是否有一些语法来解决这个问题,因为Java允许这种类型的循环功能的分配。

var c: Int; while ((c = reader.read()) != 1) { } 

语法无效,因为c = reader.read()不是Kotlin中的表达式 – 这可以防止所有== vs = bugs。

您必须将其重写为:

 while (true) { val c = reader.read() if (c == 1) break ... } 

注意: 另一个答案解释了你的语法的问题,这里是使用while循环的替代方法。

Kotlin的一个好处就是你可以改变自己的世界,就像你想要的一样。 因此,让我们创建一个扩展函数来做其他答案中的基本内容,但使其更具吸引力。

有了这个扩展功能:

 inline fun Reader.readWhile(crossinline predicate: (Int) -> Boolean): Sequence<Char> { return generateSequence { val c = this.read() if (c != -1 && predicate(c)) { c.toChar() } else { null } } } 

您现在可以简单地:

 reader.readWhile { it != 1 }.forEach { // do something with each char } 

如果你想自动关闭阅读器:

 reader.use { reader.readWhile { it != 1 }.forEach { // do something with each char } } 

当然,你可以根据你的需要决定序列是Char还是Int 。 您可以创建自己的useCharsforEachChar或任何使您的代码如您所愿的方式。 其他扩展的例子请看kotlin.io的Kotlin API Refrence , 特别是Reader的想法。

单元测试

扩展功能的单元测试:

 @Test fun testSo32596261() { val reader = CharArrayReader(charArrayOf('A', 'B', 'C', 1.toChar(), 'D', 'E', 'F')) reader.use { assertEquals(listOf('A', 'B', 'C'), reader.readWhile { it != 1 }.toList()) } }