目录
什么是 Lua 迭代器
Lua 迭代器 (Iterator) 是一种用于遍历数据结构的机制,通常与 for
循环结合使用。迭代器是一个函数,每次调用返回集合中的下一个元素。Lua 提供内置迭代器(如 pairs
和 ipairs
),也支持开发者自定义迭代器。
为什么要使用迭代器
- 遍历简化:无需手动管理索引或条件。
- 灵活性:支持复杂数据结构的遍历。
- 代码复用:封装遍历逻辑,可重复使用。
- 动态性:适配运行时变化的数据。
Lua 迭代器的类型与实现
- 内置迭代器:
ipairs
:遍历数组的连续数字索引。pairs
:遍历表的所有键值对。
- 自定义迭代器:
- 无状态迭代器:通过参数传递状态。
- 有状态迭代器:使用闭包保存状态。
代码示例
内置迭代器
-- ipairs 遍历数组
local fruits = {"苹果", "香蕉", "橙子"}
for i, v in ipairs(fruits) do
print("索引: " .. i, "值: " .. v)
end
-- pairs 遍历表
local person = {name = "张三", age = 25}
for k, v in pairs(person) do
print("键: " .. k, "值: " .. tostring(v))
end
运行结果:
索引: 1 值: 苹果
索引: 2 值: 香蕉
索引: 3 值: 橙子
键: name 值: 张三
键: age 值: 25
自定义无状态迭代器
-- 无状态迭代器:遍历固定步长的数字
function stepIter(max, step)
local i = 0
return function()
i = i + step
if i <= max then
return i
end
end
end
for num in stepIter(10, 2) do
print("数字: " .. num)
end
运行结果:
数字: 2
数字: 4
数字: 6
数字: 8
数字: 10
自定义有状态迭代器
-- 有状态迭代器:遍历表并记录状态
function values(t)
local i = 0
return function()
i = i + 1
if i <= #t then
return i, t[i]
end
end
end
local colors = {"红", "绿", "蓝"}
for index, value in values(colors) do
print("索引: " .. index, "值: " .. value)
end
运行结果:
索引: 1 值: 红
索引: 2 值: 绿
索引: 3 值: 蓝
迭代器的工作机制
- 泛型 for 循环:
for var in iter() do ... end
iter()
返回迭代器函数。- 每次循环调用迭代器,返回下一个值,直到返回
nil
。 - 无状态:迭代器依赖外部参数(如表和索引)。
- 有状态:通过闭包保存遍历进度。
工作原理详解
- 迭代器函数:每次调用返回下一个元素或
nil
(结束标志)。 - 闭包:有状态迭代器利用 Lua 的闭包特性保存内部变量。
- 内置实现:
ipairs
:返回索引和值的对,仅限连续数字索引。pairs
:调用next
函数遍历表的键值对。
优点与应用场景
优点
- 简洁:隐藏遍历细节,提升可读性。
- 可定制:支持任意数据结构的遍历。
- 高效:按需生成元素,节省内存。
应用场景
- 数组遍历:处理列表数据。
- 复杂结构:遍历树或图。
- 动态生成:如无限序列或过滤器。
常见问题与注意事项
- ipairs vs pairs:
ipairs
只遍历连续索引,pairs
遍历所有键。
local t = {1, 2, [4] = 4}
for i, v in ipairs(t) do print(i, v) end -- 只到 2
for k, v in pairs(t) do print(k, v) end -- 包括 4
- 迭代器状态:
- 无状态迭代器需手动传递状态,有状态更简洁但内存开销稍大。
- 中断遍历:
- 使用
break
提前退出。
- nil 值:
- 表中
nil
会影响ipairs
的连续性。
参考资料与出站链接
- 官方文档:
- 学习资源:
- 菜鸟教程 – Lua 迭代器(中文)
- Lua Users – Iterators(英文)
- 工具支持:
- ZeroBrane Studio:调试迭代。
如果您需要更复杂的迭代器示例(如过滤器或多表遍历),请告诉我,我会进一步扩展!
发表回复