1. 引言

在 Kotlin 中,和许多其他语言一样,循环 是控制程序流程的基本结构之一。while 循环 特别适合用于在某个条件为真时重复执行一段代码。然而,Kotlin 在处理 while 条件中的变量赋值时,与其他语言(如 Java)有所不同。

在 Java 中,我们经常会在 while 条件中进行变量赋值,例如:

int value;
while ((value = getValue()) != sentinelValue) {
    // Process value
}

但在 Kotlin 中,这种写法是不被允许的。本文将解释 Kotlin 为何做出这样的设计决策,并提供几种在 Kotlin 中实现类似功能的替代方式。


2. Kotlin 为何禁止在 while 条件中赋值

Kotlin 的设计强调代码的可读性与安全性。其中一个重要的设计目标就是减少因误写导致的 bug。例如在 Java 中,我们可能会不小心把 == 写成 =,从而导致逻辑错误:

if (value = 0) { ... } // 错误:应该是 value == 0

虽然这段代码在 Java 中可以编译通过,但运行时行为却是错误的,而且这种 bug 很难发现。

✅ Kotlin 的解决方案是:不允许在需要布尔表达式的地方进行赋值操作,包括 while 循环的条件判断中。

❌ 这样的限制虽然让某些写法变得不那么“简洁”,但却大大提升了代码的安全性。


3. Kotlin 中的替代写法

虽然 Kotlin 不允许在 while 条件中赋值,但我们依然可以通过几种更清晰、更安全的方式来实现相同的功能。

3.1. 在循环外声明变量并在循环体内更新

这是一种最直观的替代方式:

var value: Int = 0
while (value != sentinelValue) {
    // do something...
    value++
}

这种写法将赋值逻辑从循环条件中分离出来,提高了代码的可读性,也更符合 Kotlin 的编码风格。

3.2. 使用 while(true) + break 控制循环

如果你需要在每次循环中获取一个新值并根据该值决定是否退出循环,可以这样写:

while (true) {
    val value = getValue()
    if (value == sentinelValue) break
    // Process value
}

⚠️ 这种方式虽然比 Java 的写法多了一行代码,但结构更清晰,逻辑更明确,不容易出错。

3.3. 使用 do-while 循环(Kotlin 中为 do {} while ())

如果你希望至少执行一次循环体,再根据条件决定是否继续循环,可以使用 do-while

do {
    val value = getValue()
    if (value == sentinelValue) break
    // Process value
} while (true)

这种方式在处理需要先执行再判断的场景时非常实用。


4. 总结

虽然 Kotlin 禁止在 while 条件中进行赋值操作,初看可能让人觉得不习惯,但这是 Kotlin 强调“安全优先”设计哲学的体现。

✅ 使用 while(true) + breakdo-while 等替代写法,不仅可以达到同样的逻辑效果,还能写出更清晰、更安全的代码。

作为 Kotlin 开发者,理解这些限制背后的原理,并学会使用 Kotlin 的惯用写法,有助于我们写出更高质量的代码。


🔗 本文示例代码可在 GitHub 仓库 中查看。


原始标题:Assignment in While Expression in Kotlin