Table
Apr 02, 2022Lua 的表分为两种类型,List 和 Record 非数值索引都为 List, 其余则为 Record,也可以混搭。
-- 纯 List
local t =
{
1,
2,
[3] = 3,
{ a = "lalalal" },
}
-- 纯 Record
local t =
{
a = "lalala",
["c"] = 123
}
-- 混搭
local t =
{
1,
a = "lalala"
}
索引
table 取值有两种方式,通过 “.” 符号或 [ ] 。
-- 等同
local t =
{
a = "lalala",
["a"] = "lalala",
}
t.a = "lalala"
t.["a"] = "lalala"
t."a" = "lalala"
长度
最简单的获取 table 长度是用 “#” 获取。但 “#” 是获取的是以索引 1 开始且连续无 nil 值的元素下标,中间夹带 Record 类型的元素是不参与长度计数。但如果出现List风格中存在 nil 就无法正确获得长度。
local t =
{
1,
nil,
}
-- #t = 1
local t =
{
1,
nil,
2,
--nil,
--a = 2,
--nil
}
-- #t = 3
local t =
{
1,
nil,
2,
nil,
a = 2,
nil
}
-- #t = 1
local t =
{
[0] = 1,
2,
}
-- #t = 1
local t =
{
[0] = 1,
2,
[1] = 1
}
-- #t = 1
local t =
{
[0] = 1,
2,
3,
[3] = 1,
[6] = 1,
}
-- #t = 6 (因为找到了6)
local t =
{
[0] = 1,
2,
3,
[3] = 1,
[110] = 1,
}
-- #t = 3 (因为没找到110)
总的来说,夹带 nil 时或不连续的 List 风格 table,无法通过 “#” 获取正确长度。通过遍历获取表格长度最安全。
遍历
遍历表有三种方式,(还有一种使用了新版本的 Lua 去除的 API,所以不做介绍)
- for key, value in pairs(t) do 以 hash 值遍历
- for key, value in ipairs(t) do 以 1 开始索引遍历连续的数组
- for i = 1, #t do 以 1 到 #t 索引遍历 t
示例
local t =
{
[0] = 0,
1,
2,
a = "hello world",
[4] = 4
}
for k, v in pairs(t) do
print("k = " .. k .. " v = " .. v)
end
-->> output :
-->> k = 1 v = 1
-->> k = 2 v = 2
-->> k = 0 v = 0
-->> k = 4 v = 4
-->> k = a v = hello world
for k, v in ipairs(t) do
print("k = " .. k .. " v = " .. v)
end
-->> output :
-->> k = 1 v = 1
-->> k = 2 v = 2
for i = 1, #t do
print("i = " .. i .. " v = " .. t[i])
end
-->> output :
-->> i = 1 v = 1
-->> i = 2 v = 2
Comments