Skip to content

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 4

0..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 循环——基于条件重复执行的标准方式。