Lua 迭代器学习笔记

什么是迭代器?

在 Lua 中,迭代器(iterator)是一种可以遍历数据集合的机制。它允许你逐个访问集合中的元素,并在不了解集合内部结构的情况下进行遍历。

Lua 官方迭代器

Lua 中提供了两种迭代器函数,分别为 ipairs()pairs()。其中,ipairs() 用于迭代数组类型的表,而 pairs() 则用于迭代非数组类型的表。

ipairs()

ipairs() 函数用于迭代数组类型的表,相当于 C 语言中的 for (i = 0; i < n; i++) 循环。它会遍历表中所有从 1 开始连续编号的元素,直到第一个不连续编号的元素。以下是 ipairs() 的语法:

luaCopy Code
for i, v in ipairs(t) do -- code end

其中,参数 t 是待迭代的表,i 是当前正在遍历的键,而 v 则是当前正在遍历的值。

接下来是一个 ipairs() 的实例:

luaCopy Code
weekdays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday"} for i, v in ipairs(weekdays) do print(i, v) end

上面的代码遍历了一个包含工作日名称的数组,输出结果如下:

Copy Code
1 Monday 2 Tuesday 3 Wednesday 4 Thursday 5 Friday

pairs()

pairs() 函数用于迭代非数组类型的表,相当于 C 语言中的 for (p = first(table); p != NULL; p = next(table, p)) 循环。它会遍历表中所有的键值对,并按随机顺序返回每一对。以下是 pairs() 的语法:

luaCopy Code
for k, v in pairs(t) do -- code end

其中,参数 t 是待迭代的表,k 是当前正在遍历的键,而 v 则是当前正在遍历的值。

接下来是一个 pairs() 的实例:

luaCopy Code
myTable = {key1 = "value1", key2 = "value2", key3 = "value3"} for k, v in pairs(myTable) do print(k, v) end

上面的代码遍历了一个包含键值对的表,输出结果如下:

Copy Code
key1 value1 key2 value2 key3 value3

自定义迭代器

除了 Lua 官方提供的迭代器函数外,你也可以自定义迭代器函数以满足特定需求。自定义迭代器函数需要返回三个值,分别为迭代器函数本身、被迭代的表、起始键值(可以理解为上一次迭代的位置)。

以下是一个使用自定义迭代器函数的实例:

luaCopy Code
function squareIterator(max) local i = 0 return function() i = i + 1 if i <= max then return i, i * i end end end for i, v in squareIterator(5) do print(i, v) end

上面的代码定义了一个名为 squareIterator 的自定义迭代器函数,它会根据传入的参数 max 返回一个迭代器函数。每次调用迭代器函数时,它会返回下一个数字和该数字的平方值。接下来,我们通过 for 循环遍历这个迭代器函数,并输出结果:

Copy Code
1 1 2 4 3 9 4 16 5 25

总结

迭代器是一种强大的工具,它可以帮助我们在不了解数据结构的情况下遍历集合中的元素。通过本文,我们学习了 Lua 中官方的迭代器函数 ipairs()pairs(),以及如何使用自定义迭代器函数进行遍历。相信这些知识对你在日常 Lua 编程中处理数据结构将有所帮助。