举例讲解Lua中的Table数据结构
Lua中Table是唯一的数据结构,兼具关联数组和列表功能,支持任何非nil值作为键,但键按引用比较,字符串和数字作为键更实用。并且索引从1开始,可用pairs遍历,全局变量则存储在_G表中。此外,表是Lua语言的核心特性。
在Lua的世界里,Table可以说是唯一的数据结构。你别看它名字简单,实际上它的能力强得惊人——它既是关联数组,又可以被当作列表来用。如果非要找个类比,那最接近的就是PHP里的数组,或者Ja vaScript里的对象。本质上,Table是一种哈希查找表(dict),但同时又支持按顺序索引,像list一样操作。下面我们就一步步拆解,看看它到底怎么用。

先看一个最直观的用法:把Table当成字典或map。Lua里默认用字符串类型的key,写起来非常自然。
-- 它们是关联数组。
-- 类似于PHP的数组或者js的对象,
-- 它们是哈希查找表(dict),也可以按list去使用。
需要提醒的是,字符串key可以通过点号直接引用,就像Ja vaScript那样简洁。也可以随时新增或删除键值对,非常灵活。
-- Dict的迭代默认使用string类型的key:
t = {key1 = 'value1', key2 = false}
print(t.key1) -- 打印 'value1'.
t.newKey = {} -- 添加新的 key/value 对。
t.key2 = nil -- 从table删除 key2。
不过,Table的key不仅仅限于字符串。任何非nil的值都可以作为key,包括数字、甚至另一个Table。但这里有个坑——当key是Table时,比较的是对象的引用(id),而不是内容。也就是说,如果你用一个临时创建的{}作为key,后面再拿另一个{}去查,是查不到的。所以实际开发中,字符串和数字才是更靠谱的选择。
u = {['@!#'] = 'qbert', [{}] = 1729, [6.28] = 'tau'}
print(u[6.28]) -- 打印 "tau"
a = u['@!#'] -- 现在 a = 'qbert'.
b = u[{}] -- 我们期待的是 1729, 但是得到的是nil:
-- b = nil ,因为没有找到。
-- 之所以没找到,是因为我们用的key与保存数据时用的不是同一个对象。
-- 所以字符串和数字是可用性更好的key。
另外,Lua允许一个很爽的语法糖:如果函数只有一个参数且这个参数是Table,那么调用时可以省略括号。这让代码看起来更干净。
function h(x) print(x.key1) end
h{key1 = 'Sonmi~451'} -- 打印'Sonmi~451'.
遍历Table也很直接,pairs函数能同时输出key和value。别忘了Lua里还有一个特殊的全局Table叫_G,它保存了所有全局变量——连它自己都可以通过_G['_G']访问到。
print(key, val)
end
print(_G['_G'] == _G) -- 打印'true'.
按list/array的方式使用
说完字典用法,再来看看怎么用Table模拟列表。其实很简单:用连续的整数作为key,就可以像数组一样索引。注意,Lua的索引从1开始(不是0),这一点和大多数语言不同,但习惯就好。
-- List 的迭代方式隐含会添加int的key:
v = {'value1', 'value2', 1.21, 'gigawatts'}
for i = 1, #v do -- #v 是list的size
print(v[i]) -- 索引从 1 开始!! 太疯狂了!
end
-- 'list'并非真正的类型,v 还是一个table,
-- 只不过它有连续的整数作为key,可以像list那样去使用。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















