Scala do…while 循环的入门与进阶
在编程的世界里,循环就像一条永不停歇的传送带,把重复的任务高效地处理一遍又一遍。对于刚接触 Scala 的开发者来说,do…while 循环可能不像 for 或 while 那样常见,但它在某些场景下却有着不可替代的作用。今天,我们就来深入聊聊 Scala 中的 do…while 循环,从基础语法到实际应用,一步步带你掌握它的精髓。
什么是 Scala do…while 循环?
在大多数编程语言中,while 循环是先判断条件再执行代码块,而 do…while 则是先执行一次代码块,再判断条件是否继续。这种“先执行,后判断”的特性,让它特别适合处理那些至少需要执行一次的逻辑。
在 Scala 中,do…while 的语法结构如下:
do {
// 循环体代码
} while (条件表达式)
注意:Scala 中的 do…while 与 Java 类似,但语法更简洁,且对表达式返回值的处理更灵活。
举个例子,假设我们要让用户输入一个数字,直到输入的数字大于 10 为止:
var number = 0
do {
println("请输入一个大于 10 的数字:")
number = scala.io.StdIn.readInt()
println(s"你输入的是:$number")
} while (number <= 10)
注释说明:
var number = 0:定义一个可变变量,用于存储用户输入。println("请输入..."):提示用户输入内容。scala.io.StdIn.readInt():从标准输入读取一个整数,是 Scala 中读取用户输入的标准方式。while (number <= 10):判断输入的数字是否小于等于 10,如果是,则继续循环。- 整个循环至少会执行一次,即使用户一开始输入的就是大于 10 的数,也会先执行一次输出再判断。
与 while 循环的对比
我们来对比一下 do…while 和普通的 while 循环,帮助你理解它们的区别。
| 特性 | do…while 循环 | while 循环 |
|---|---|---|
| 执行顺序 | 先执行,再判断 | 先判断,再执行 |
| 是否保证执行至少一次 | 是 | 否 |
| 适合场景 | 用户输入验证、初始化后循环 | 条件驱动的重复任务 |
来看一个对比代码:
// do...while 示例
var i = 10
do {
println(s"do...while: $i")
i += 1
} while (i < 5)
// while 示例
var j = 10
while (j < 5) {
println(s"while: $j")
j += 1
}
注释说明:
- 第一个循环(
do…while)会输出一次do...while: 10,因为即使条件i < 5为假,也先执行了一次。- 第二个循环(
while)由于条件一开始就不成立,所以一次都不会执行。- 这说明
do…while保证了“至少执行一次”,而while不保证。
实际应用场景:用户输入验证
在开发交互式程序时,输入验证是一个高频需求。比如我们要确保用户输入的是一个有效的年龄(1~120 岁之间):
var age = 0
do {
println("请输入你的年龄(1-120):")
age = scala.io.StdIn.readInt()
if (age < 1 || age > 120) {
println("年龄无效,请重新输入!")
}
} while (age < 1 || age > 120)
println(s"恭喜!你的年龄是:$age 岁")
注释说明:
- 使用
do…while确保用户至少输入一次。- 条件
age < 1 || age > 120检查输入是否超出合理范围。- 如果输入无效,输出提示并继续循环。
- 只有当输入在 1 到 120 之间时,才会跳出循环,输出结果。
- 这种结构在表单验证、菜单选择等场景中非常实用。
多条件判断与复杂逻辑
do…while 循环不仅可以处理简单条件,也能应对复杂的多条件判断。比如我们模拟一个“密码尝试”系统,用户最多尝试 3 次,且必须满足长度至少 6 位:
var attempts = 0
var password = ""
do {
attempts += 1
println(s"第 $attempts 次尝试,请输入密码(至少 6 位):")
password = scala.io.StdIn.readLine()
if (password.length < 6) {
println("密码太短,请输入至少 6 位!")
} else if (password == "123456") {
println("密码错误!请重新输入。")
} else {
println("密码正确!登录成功!")
}
} while (attempts < 3 && (password.length < 6 || password == "123456"))
if (attempts >= 3 && (password.length < 6 || password == "123456")) {
println("尝试次数已满,账户已被锁定。")
}
注释说明:
attempts += 1:计数器递增,记录尝试次数。password.length < 6:检查密码长度是否合规。password == "123456":模拟常见弱密码,防止用户直接输入。- 循环条件
attempts < 3 && (password.length < 6 || password == "123456"):只有在尝试次数小于 3,且密码不合规或为默认密码时才继续。- 最后一个
if用于判断是否因失败而锁定账户。
这个例子展示了 do…while 如何在复杂业务逻辑中发挥作用,尤其适合“用户交互+条件限制”的场景。
常见陷阱与最佳实践
尽管 do…while 循环功能强大,但使用不当也可能导致问题。以下是几个需要注意的点:
1. 忘记更新循环变量
如果在循环体内没有更新控制变量,可能导致无限循环。
var count = 0
do {
println("无限循环中...")
// 缺少 count += 1
} while (count < 5)
❌ 错误:
count从未增加,条件永远为真,程序将陷入死循环。
2. 条件表达式写错
条件判断错误也会导致逻辑异常。比如把 <= 写成 <,或逻辑运算符用错。
var num = 10
do {
println(s"当前值:$num")
} while (num > 5) // 如果 num 从 10 开始,会执行 10 次?不!
✅ 正确:如果
num没有在循环中修改,就会无限执行。
✅ 建议:始终确保循环体中能改变条件变量的值。
3. 使用 var 要谨慎
在 Scala 中,推荐使用不可变变量(val),但 do…while 循环中常需要可变变量来控制流程。此时应明确用途,避免滥用 var。
val maxAttempts = 3
var attempts = 0
do {
attempts += 1
// ...
} while (attempts < maxAttempts)
✅ 推荐做法:将常量定义为
val,仅将需要变化的变量设为var。
总结与建议
Scala do…while 循环 是一种“先执行,后判断”的控制结构,特别适合那些必须至少执行一次的场景。无论是用户输入验证、密码尝试、菜单选择,还是初始化后循环处理数据,它都能提供清晰的逻辑表达。
相比 while 循环,do…while 更强调“执行优先”,这在交互式程序中非常自然。但也要注意:不能忽略循环变量的更新,避免无限循环;同时合理使用 var 和 val,保持代码的可读性和安全性。
掌握 Scala do…while 循环,不仅能让你写出更健壮的程序,还能在面对复杂交互逻辑时,拥有更灵活的控制手段。希望今天的分享,能帮你更深入地理解这一基础但重要的控制结构。下一次写循环时,不妨想想:这个逻辑是否值得用 do…while?