您的位置:首页 > 博客中心 > 互联网 >

lua中table需要注意的一点东西

时间:2022-04-25 13:08

关于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

  输出为:

1
2
hi
5
6
8

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 = 1
i = 2, value = 2
i = 3, value = hi
i = 4, value = 5
i = 5, value = 6
i = 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的时候要根据自己的需求而选择一种

本类排行

今日推荐

热门手游