Chapter 19: The Table Library
table 库包含操作表和数组的辅助函数。table 库提供了从列表中插入和移除元素,对数组的元素进行排序,连接数组中的所有string 的函数。
19.1 Insert and Remove
如果t 是数组{10,20,30},调用table.insert(t,1,15) 后t 变成{15,10,20,30}。如果调用insert 时不含位置信息,默认在数组的尾部插入。
t = {}
for line in io.lines() do
table.insert(t, line)
end
print(#t) --> (number of lines read)
(Lua 5.0 中这种惯用法很常用。)
Lua 5.1 中的做法:
t = {}
for line in io.lines() do
t[#t+1]=line
end
print(#t) --> (number of lines read)
table.remove 从数组中指定的位置移除元素,并且这可能会导至其它元素往某个方向移动一个位置。如果调用时不含位置信息,默认移除最后一个元素。
19.2 Sort
table.sort 的第一个参数是待排序的数组,第二个参数是可选的排序函数。如果不提供排序函数则默认从小到大排序(对应’<’ 运算符)。
一种常见的错误是试图排序表的indices。如果你想排序它们,你要把它们拷贝到一个数组,然后再进行排序。
按字典序输出表的key
lines = {
luaH_set = 10,
luaH_get = 24,
luaH_present = 48,
}
a = {}
for n in pairs(lines) do a[#a + 1] = n end -- 将lines 表的key 存进新数组
table.sort(a) -- 排序key
for i,n in ipairs(a) do print(n) end
以表的key 的字典序遍历表的迭代器
function pairsByKeys (t, f)
local a = {}
for n in pairs(t) do a[#a + 1] = n end
table.sort(a, f)
local i = 0 -- iterator variable
return function () -- iterator function
i = i + 1
return a[i], t[a[i]] -- 返回表的key,value
end
end
lines = {
luaH_set = 10,
luaH_get = 24,
luaH_present = 48,
}
for i, v in pairsByKeys(lines) do
print(i, v)
end
19.3 Concatenation
table.concat 我们已经在11.6 节看到过了。它接受一个strings 的列表,返回的结果是所有strings 连接在一起的一个strings。第二个可选参数是一个作为分隔符的string,它会反复插在两string 之间。还有第三,四个可选参数,它们指定了连接操作从哪里开始和到那里结束。
下面的函数是table.concat 的一个有趣泛化版实现。它接受嵌套的stirngs 列表:
function rconcat (l)
if type(l) ~= "table" then return l end
local res = {}
for i=1, #l do
res[i] = rconcat(l[i])
end
return table.concat(res)
end
print(rconcat{{"a", {" nice"}}, " and", {{" long"}, {" list"}}})
print(rconcat{"a"," nice"," and"," long"," list"})
--> a nice and long list
--> a nice and long list
rconcat 的参数可以是嵌套的表,也可以不是。