Kotlin:为什么我不能在循环守卫中进行分配?
Kotlin: Why can't I do an assignment in a loop guard?
为什么这个语法无效? IntelliJ 报告的错误是在这种上下文中只允许使用表达式(第 2 行)。我想知道是否有一些语法可以用来解决这个问题,因为 Java 允许这种类型的循环赋值功能。
var c: Int;
while ((c = reader.read()) != 1) {
}
语法无效,因为 c = reader.read()
不是 Kotlin 中的表达式——这可以防止所有 ==
与 =
错误。
您必须将其重写为:
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:
reader.use {
reader.readWhile { it != 1 }.forEach {
// do something with each char
}
}
当然,您可以根据需要决定序列是 Char
还是 Int
。您可以创建自己的 useChars
或 forEachChar
或任何使您的代码成为您想要的方式的东西。查看 Kotlin API Refrence for kotlin.io for examples of other extensions, especially on 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())
}
}
You can use something like this
val reader = BufferedReader(null)
var line: String? = null
while ({ line = reader.readLine(); line }() != null) {
println(line)
}
在 kotlin 中使用 Reader 有更简洁的方式 - "forEachLine" extension function
val writer = StringWriter()
val reader = BufferedReader(InputStreamReader(stream, "UTF-8"))
reader.forEachLine { writer.write(it) }
为什么这个语法无效? IntelliJ 报告的错误是在这种上下文中只允许使用表达式(第 2 行)。我想知道是否有一些语法可以用来解决这个问题,因为 Java 允许这种类型的循环赋值功能。
var c: Int;
while ((c = reader.read()) != 1) {
}
语法无效,因为 c = reader.read()
不是 Kotlin 中的表达式——这可以防止所有 ==
与 =
错误。
您必须将其重写为:
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:
reader.use {
reader.readWhile { it != 1 }.forEach {
// do something with each char
}
}
当然,您可以根据需要决定序列是 Char
还是 Int
。您可以创建自己的 useChars
或 forEachChar
或任何使您的代码成为您想要的方式的东西。查看 Kotlin API Refrence for kotlin.io for examples of other extensions, especially on 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())
}
}
You can use something like this
val reader = BufferedReader(null)
var line: String? = null
while ({ line = reader.readLine(); line }() != null) {
println(line)
}
在 kotlin 中使用 Reader 有更简洁的方式 - "forEachLine" extension function
val writer = StringWriter()
val reader = BufferedReader(InputStreamReader(stream, "UTF-8"))
reader.forEachLine { writer.write(it) }