Lua 中的 for ... in 循环(泛型 for 循环)用于遍历迭代器函数返回的值序列。这是遍历表、数组和其他可迭代对象的常用方式。
for 变量列表 in 迭代器函数, 状态值, 控制值 do
-- 循环体
end
每轮循环调用 迭代器函数,参数是 状态值 和 控制值,其返回值会赋值给 变量列表
状态值 始终不变,用于提供额外的信息
控制值 记录上次迭代的位置,会被 迭代器函数 的返回第一个返回值更新
迭代器函数 的返回第一个返回值为 nil 时结束循环
graph TD
START([开始]) --> INVOKE("迭代器函数(状态值, 控制值)") --> ASSIGN("变量列表 = 迭代器返回值") --> CTRL("控制值 = 第一个返回值") --> COND{"控制值 == nil?"} -- 真 --> END([结束])
COND -- 假 --> 循环体 --> INVOKE
示例:
-- 迭代器函数
function iterator(state, control)
control = control + 1
if control < state then
return control, control * control -- 返回索引和值
end
end
-- 循环
for i, v in iterator, 10, 5 do
print("索引:", i, "值:", v)
end
状态值为 10
初始控制值为 5
运行结果:
索引: 6 值: 36
索引: 7 值: 49
索引: 8 值: 64
索引: 9 值: 81
Lua 标准库中提供 ipairs 和 pairs 函数用于遍历表,前者用于数组,后者用于一般的表。
示例:
-- 定义数组
local array = {10, 20, 30, 40, 50}
-- 遍历数组
for i,v in ipairs(array) do
print(i, v)
end
-- 定义表
local dict = {
name = "Alice",
age = 25,
city = "Beijing"
}
-- 遍历
for k,v in pairs(dict) do
print(k, v)
end
运行结果:
1 10
2 20
3 30
4 40
5 50
name Alice
city Beijing
age 25