Lua 迭代器
迭代器用于“一个一个取出数据”。你在 for ... in ... do 中使用的 pairs()、ipairs(),本质上都和迭代器有关。
初学时,你不需要马上写复杂迭代器,但需要理解它能解决什么问题。
泛型 for 的形式
泛型 for 的基本形式是:
for var1, var2 in iterator do
-- 循环体
end
最常见例子是 ipairs():
main.lua
local values = {"a", "b", "c"}
for index, value in ipairs(values) do
print(index, value)
end
输出:
1 a
2 b
3 c
ipairs 和 pairs
ipairs() 适合遍历连续数组:
main.lua
local values = {10, 20, 30}
for index, value in ipairs(values) do
print(index, value)
end
pairs() 适合遍历 table 键值对:
main.lua
local device = {
id = "sensor-001",
online = true,
value = 23.5,
}
for key, value in pairs(device) do
print(key, value)
end
pairs() 的遍历顺序不固定。不要把它的输出顺序用于业务逻辑。
自定义简单迭代器
最简单的迭代器是一个函数。每次调用它时,返回下一个值;没有值时返回 nil。
counter.lua
local function counter(max)
local current = 0
return function()
current = current + 1
if current <= max then
return current
end
end
end
for value in counter(3) do
print(value)
end
输出:
1
2
3
这里返回的匿名函数捕获了 current 和 max,这就是闭包。