详情参考 lua手册数组
1. 范性for语义闭包
在了解pair和ipair前先简单了解下lua中的for循环,这里只阐述范性for循环的语义,范性 for 在本身内部保存迭代函数,实际上它保存三个值:迭代函数、状态常量、控制变量。for的范式以下函数
for <var-list> in <exp-list> do <body> end
<var-list>是以一个或多个逗号分隔的变量名列表,<exp-list>是以一个或多个逗号分隔的表达式列表,一般状况下 exp-list 只有一个值:迭代函数的调用。lua
for k, v in pairs(t) do print(k, v) end
首先,初始化,计算 in 后面表达式的值,表达式应该返回范性 for 须要的三个值:迭代函数、状态常量、控制变量;与多值赋值同样,若是表达式返回的结果个数不足三个会自动用 nil 补足,多出部分会被忽略。spa
第二,将状态常量和控制变量做为参数调用迭代函数(注意:对于 for 结构来讲,状态常量没有用处,仅仅在初始化时获取他的值并传递给迭代函数)。code
第三,将迭代函数返回的值赋给变量列表。blog
第四,若是返回的第一个值为 nil 循环结束,不然执行循环体。索引
第五,回到第二步再次调用迭代函数。three
2. ipair函数ip
无状态的迭代器是指不保留任何状态的迭代器,所以在循环中咱们能够利用无状态迭代器避免建立闭包花费额外的代价。每一次迭代,迭代函数都是用两个变量(状态常量和控制变量)的值做为参数被调用,一个无状态的迭代器只利用这两个值能够获取下一个元素。这种无状态迭代器的典型的简单的例子是 ipairs,他遍历数组的每个元素。
a = {"one", "two", "three"} for i, v in ipairs(a) do print(i, v) end 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
在上面的代码中,ipairs函数返回三个值,迭代函数为iter,a为状态常量,控制变量的初始值为0,这三者由for语义保存,每次调用迭代函数iter返回表中的key和value,即 i 和 v 的值,能够看到,在pair中,只能遍历有数字索引的元素。若是出现以下图的状况,会没法遍历全部数字索引元素。
3. pair函数
ipair函数主要由lua的内置函数next实现,next原型大体为 next (table [, index])。它容许程序遍历表的全部字段。它的第一个参数是一个表,它的第二个参数是该表中的索引。 next返回表的下一个索引及其关联值。当使用nil做为其第二个参数调用时, next返回初始索引及其关联值。使用最后一个索引调用时,或者在空表中使用nil时, next返回nil。若是第二个参数不存在,则将其解释为nil。此外你可使用next(t)检查表是否为空。pair有两种形式,以下。
function pairs (t) return next, t, nil end for k, v in next, t do ... end
4. 总结