一、表(Table)
当调用函数 math.sin 时,我们可能认为是“调用了 math 库中函数 sin”;而对于 Lua 语言来说,其实际含义是“以字符串"sin"为键检索表math”
Lua 语言中的表本质上是一种辅助数组(associative array),这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引(nil 除外)。
使用构造器表达式(constructor expression)创建表,其最简单的形式是{}:
> a = {} > k = "x" > a[k] = 10 > a[20] = "great" > a["x"] 10 > k = 20 > a[k] great > a["x"] = a["x"] + 1 > a["x"] 11
表永远是匿名的,表本身和保存表的变量之间没有固定的关系:
> a = {} > a["x"] = 10 > b = a -- 'b' 和 'a' 引用同一张表 > b["x"] = 20 > a["x"] 20 > a = nil -- 只有 'b' 仍然指向表 > b = nil -- 没有指向表的引用了
- 对于一个表而言,当程序中不再有指向它的引用时,垃圾收集器会最终删除这个表并重用其占用的内存。
二、遍历表
我们可以使用 paris
迭代器遍历表中的键值对:
> t = {10, nil, 3, '4'} > #t 4 > t[4] = nil > #t 3 > t[3] = nil > #t 1 > t = {10, print, x = 12, k = 'hi'} > t table: 0000000001178370 > for k, v in pairs(t) do >> print(k, v) >> end 1 10 2 function: 0000000065b9cff0 k hi x 12
- 受限于表在 Lua 语言中的实现机制,遍历过程中元素的出现顺序可能是随机的,相同的程序再每次运行时也可能产生不同的顺序。唯一可以确定的是,在遍历的过程中,每个元素会且只会出现一次。
对于列表而言一使用 ipairs 迭代器:
> t = {10, print, 12, "hi"} > > for k, v in ipairs(t) do >> print(k, v) >> end 1 10 2 function: 0000000065b9cff0 3 12 4 hi
- 此时,Lua 会确保遍历是按照顺序进行的。
另一种遍历序列的方法是使用数值型 for 循环:
> t= {10, print, 12, "hi"} > for k = 1, #t do >> print(k, t[k]) >> end 1 10 2 function: 0000000065b9cff0 3 12 4 hi