关于table的文字说明我引用了lua程序设计的一些语句来概括表述:
table类型实现了“关系数组”。“关系数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引他,还可以使用字符串活着其他类型的值(除了nil)来索引他。此外,table没有固定大小,可以动态的添加任意数量的元素到一个table中。
在lua中,table既不是“值”也不是“变量”,而是“对象”,可以将一个table想象成一种动态分配的对象,程序仅持有一个对他们的引用(或指针),lua不会暗中产生table的副本或者创建新的table。
引用完别人的说明之后,现在来看一下一些例子:
local testTable = { 1, 2, "hi", config = {1,2,3}, 5, 6, k = "hello", 8}for i=1,#testTable do print(testTable[i])end
输出为:
12hi568
config = {1,2,3}和k="hello"去哪里了呢?待会在分析这个问题,接下来再看一个实例:
local testTable = { 1, 2, "hi", config = {1,2,3}, 5, 6, k = "hello", 8}for i,value in ipairs(testTable) do print("i = " .. i .. ", value = " .. value)end
他的输出为:
i = 1, value = 1i = 2, value = 2i = 3, value = hii = 4, value = 5i = 5, value = 6i = 6, value = 8
config = {1,2,3}和k="hello"也并没有输出。再看第三个实例:
local testTable = { 1, 2, "hi", config = {1,2,3}, 5, 6, k = "hello", 8}for k,v in pairs(testTable) do print(k,v)end
输出为:
local testTable = { 1, 2, "hi", config = {1,2,3}, 5, 6, k = "hello", 8}for k,v in pairs(testTable) do print(k,v)end
这时候是把所有的都输出了,但是有没有发现,输出顺序有点变化了,
因为config = {1,2,3}的索引为config,k = "hello"的索引为k,而其他的都有lua给予的自然索引,比如1的索引为1,2的索引为2,5的索引为3,输出的时候是先把自然索引的全部输出,接着在根据在table的顺序进行一个个的输出。
为什么第一个实例和第二个实例只输出了自然索引的值,而忽略了其他的?其实第一个实例和第二个实例实际上时一样的,只是表现形式不一样,因此我们只需要说明第二种与第三种的区别即可:
pairs会遍历table的所有键值对,而ipairs就是固定地从key值1开始,下次key累加1进行遍历,如果key对应的value不存在,就停止遍历。因此我们在遍历table的时候要根据自己的需求而选择一种