第一版针对 Lua 5.0 编写。虽然在很大程度上仍然适用于后续版本,但存在一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
Lua 编程 Lua | ||
第一部分。语言 第 7 章。迭代器和通用 for |
顾名思义,无状态迭代器是不自行保留任何状态的迭代器。因此,我们可以在多个循环中使用同一个无状态迭代器,避免创建新闭包的成本。
在每次迭代中,for 循环使用两个参数调用其迭代器函数:不变状态和控制变量。无状态迭代器仅使用这两个参数为迭代生成下一个元素。这种迭代器的典型示例是 ipairs
,它遍历数组中的所有元素,如下所示
a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end迭代状态是正在遍历的表(不变状态,在循环期间不会更改),加上当前索引(控制变量)。
ipairs
和它返回的迭代器都非常简单;我们可以用 Lua 编写如下内容
function iter (a, i) i = i + 1 local v = a[i] if v then return i, v end end function ipairs (a) return iter, a, 0 end当 Lua 在 for 循环中调用
ipairs(a)
时,它会获取三个值:iter
函数作为迭代器,a
作为不变状态,以及零作为控制变量的初始值。然后,Lua 调用 iter(a, 0)
,结果为 1, a[1]
(除非 a[1]
已经是 nil)。在第二次迭代中,它调用 iter(a, 1)
,结果为 2, a[2]
,依此类推,直到第一个 nil 元素。
pairs
函数遍历表中的所有元素,类似,但迭代器函数是 next
函数,这是 Lua 中的一个基本函数
function pairs (t) return next, t, nil end调用
next(t, k)
,其中 k
是表 t
的键,将按任意顺序返回表中的下一个键。(它还将与该键关联的值作为第二个返回值返回。)调用 next(t, nil)
将返回第一个对。如果没有更多对,next
将返回 nil。
有些人更喜欢直接使用 next
,而不调用 pairs
for k, v in next, t do ... end请记住,for 循环的表达式列表已调整为三个结果,因此 Lua 获取
next
、t
和 nil,这正是它调用 pairs(t)
时获取的内容。
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |