目录

  1. 什么是 Lua 迭代器
  2. 为什么要使用迭代器
  3. Lua 迭代器的类型与实现
  4. 代码示例
  1. 迭代器的工作机制
  2. 工作原理详解
  3. 优点与应用场景
  4. 常见问题与注意事项
  5. 参考资料与出站链接

什么是 Lua 迭代器

Lua 迭代器 (Iterator) 是一种用于遍历数据结构的机制,通常与 for 循环结合使用。迭代器是一个函数,每次调用返回集合中的下一个元素。Lua 提供内置迭代器(如 pairsipairs),也支持开发者自定义迭代器。


为什么要使用迭代器

  • 遍历简化:无需手动管理索引或条件。
  • 灵活性:支持复杂数据结构的遍历。
  • 代码复用:封装遍历逻辑,可重复使用。
  • 动态性:适配运行时变化的数据。

Lua 迭代器的类型与实现

  1. 内置迭代器
  • ipairs:遍历数组的连续数字索引。
  • pairs:遍历表的所有键值对。
  1. 自定义迭代器
  • 无状态迭代器:通过参数传递状态。
  • 有状态迭代器:使用闭包保存状态。

代码示例

内置迭代器

-- 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 函数遍历表的键值对。

优点与应用场景

优点

  • 简洁:隐藏遍历细节,提升可读性。
  • 可定制:支持任意数据结构的遍历。
  • 高效:按需生成元素,节省内存。

应用场景

  • 数组遍历:处理列表数据。
  • 复杂结构:遍历树或图。
  • 动态生成:如无限序列或过滤器。

常见问题与注意事项

  1. 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
  1. 迭代器状态
  • 无状态迭代器需手动传递状态,有状态更简洁但内存开销稍大。
  1. 中断遍历
  • 使用 break 提前退出。
  1. nil 值
  • 表中 nil 会影响 ipairs 的连续性。

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 工具支持

如果您需要更复杂的迭代器示例(如过滤器或多表遍历),请告诉我,我会进一步扩展!