for 循环
当你需要对一系列元素逐一做同样的事情时,for 循环就是正确的工具。YaoXiang 的 for 循环设计得简洁而精确。
基本语法
语法规范中 for 语句的形式定义:
for 'mut'? Identifier 'in' Expr Block翻译过来:for 开头,可以有一个可选的 mut,然后是循环变量名,接着是 in 和被遍历的表达式,最后是循环体代码块。
遍历数字范围
最常见的用法是用 .. 创建范围,然后用 for 遍历:
yaoxiang
// 从 0 到 4(不包括 5)
for i in 0..5 {
print(i)
}
// 输出:0 1 2 3 40..5 表示从 0 开始(包含)到 5 结束(不包含)的范围。这是计算机科学领域的通用惯例——左闭右开区间。
你也可以用变量来定义范围的起点和终点:
yaoxiang
start = 10
end = 15
for n in start..end {
print(n)
}
// 输出:10 11 12 13 14遍历列表
for 不仅可以遍历数字范围,还可以直接遍历列表、数组等集合:
yaoxiang
colors = ["红", "橙", "黄", "绿", "蓝"]
for color in colors {
print("当前颜色: " + color)
}
// 输出:
// 当前颜色: 红
// 当前颜色: 橙
// ... 依此类推for 的独特语义:每次迭代绑定新值
YaoXiang 的 for 循环有一个和其他语言不同的设计:每次迭代是创建新的绑定,而不是修改同一个变量。
用表格来理解:
| 迭代 | 发生的事情 |
|---|---|
| 第 1 次 | 创建新绑定 i = 0,执行循环体,然后绑定销毁 |
| 第 2 次 | 创建新绑定 i = 1(全新的绑定),执行循环体,然后销毁 |
| 第 3 次 | 创建新绑定 i = 2,执行循环体,然后销毁 |
| ... | ... |
| 循环结束 | 范围耗尽,循环终止 |
这意味着每次迭代的循环变量都是一个独立的新值。这对安全性非常有帮助——你不用担心循环变量被意外修改:
yaoxiang
for i in 1..5 {
// i = i + 1 // 错误:默认不可变,不能修改 i
print(i)
}for mut:需要修改时显式声明
如果你确实需要在循环体内修改循环变量(比如当作累加器),用 for mut:
yaoxiang
// 用 for mut 允许在循环体内修改绑定
for mut i in 0..5 {
i = i * 2
print(i)
}
// 输出:0 2 4 6 8注意:即使使用 for mut,每次迭代依然是新的绑定。for mut 只是让新绑定本身是可变而已,并不会让上一个迭代的修改传递到下一个迭代。
yaoxiang
for mut i in 1..5 {
i = i + 100
print(i) // 每次都打印 101, 102, 103, 104
}
// 每次迭代 i 都从范围值重新开始,上一次的修改不影响下一次循环变量不能遮蔽外层变量
YaoXiang 禁止变量遮蔽。for 的循环变量不能和外层作用域中的变量同名:
yaoxiang
// 错误示范
i = 10
// for i in 1..5 { // 编译错误!i 已经在外层声明
// print(i)
// }
// 正确写法——换个名字
i = 10
for j in 1..5 {
print(j)
}这个规则让你永远不会困惑"当前代码里的变量到底指向哪个"。
与其他语言的对比
| 语言 | for 循环变量语义 |
|---|---|
| YaoXiang | 每次迭代绑定新值 |
| Rust | 修改同一个变量(需要 mut) |
| Python | 修改同一个变量 |
| C/C++ | 修改同一个变量 |
YaoXiang 的设计更接近人类直觉——"对于集合中的每个元素做某件事"——每个元素是独立的个体。
小结
| 要点 | 说明 |
|---|---|
| 遍历范围 | for i in 0..5,左闭右开 |
| 遍历集合 | for item in list,逐个取元素 |
| 绑定语义 | 每次迭代创建新绑定,不是修改同一个变量 |
| 默认不可变 | 循环变量不可修改,防止意外 |
for mut | 需要修改时显式声明 |
| 禁止遮蔽 | 循环变量不能与外层变量同名 |
下一章你将学习 while 循环——基于条件重复执行的标准方式。
