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

关于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的时候要根据自己的需求而选择一种

时间: 2024-08-27 02:19:47

lua中table需要注意的一点东西的相关文章

c/c++_Lua交互----关于Lua中table类型的使用实例

lua中的复合类型 只有table 类型,你可以当做任意容器使用  ,比如 数组    PHP中的关联数组  C++中的 std::map 等等  而且提供了很方便的使用 下面是lua中 table类型的使用 c++加载代码 #include "string.h" extern "C" { #include "lualib.h" //包含lua lib #include "lauxlib.h" //辅助函数 }; #pragm

Lua中table类型的源码实现

  1.概述 table是lua中唯一的表示数据结构的工具.它可以用于实现数据容器.函数环境(Env).元表(metatable).模块(module)和注册表(registery)等其他各种用途.因此了解table的实现是非常有必要的,根据<Lua中数据类型的源码实现>中知道,在Lua中,table是由结构体体Table来实现的.下面将以Lua 5.2.1的源码来看table的实现.   2.实现原理 在Lua5.0以后,table是以一种混合型数据结构来实现的,它包含一个哈希表部分和一个数

lua 中table的使用和分析

1.table有4种基本操作:读,写,迭代和获取长度. lua中没有删除操作而是将对应键位的值设置为nil. lua的内部定义是在lobject.h </pre><pre code_snippet_id="580775" snippet_file_name="blog_20150115_1_6202329" name="code" class="python"><pre name="co

lua中table的实现

table 在lua中是一个非常常用的数据结构,可以用来存放各种类型的元素,那么就会让人好奇,它这么强大,它是用什么数据结构实现的呢 首先,考虑 table = {1, 2, 3, 4, 5, 6, 7, 8} 这样的结构, 为了获得最快的访问速度,它是用数组实现的 那么如果执行table[10000] = 10; 莫非要创建10000个元素的数组,没有值的都存为nil,这样的空间利用效率太低无法接受,所有除了数组段之外,table还有一个哈希段,10000这个key会存在哈希段中,当太大的ke

lua中table的遍历,以及删除

Lua 内table遍历 在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: 1. ipairs for index, value in ipairs(table) do end 注:这种方式的遍历只会从key为1的地方开始,一直以key递增1的顺序来遍历,若找到一个递增不是1的key就结束遍历,无论后面是否仍然是顺序的key. 1 --Sample_1: 2 local tab1 = 3 { 4 [1] = 1, 5 [2] = 2, 6 [

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

lua中table 库函数 insert、remove、concat、sort的简单使用【简记】

1.insert  1 do 2 t1 = {"欲", "泪", "成", "雪"} 3 table.insert(t1,"seeyou")-- 往t1末尾插入元素 "seeyou" 4 table.insert(t1, 3, "bug")-- 往t1索引为3的位置插入元素"bug" 5 for i,v in ipairs(t1) do print

Lua中的weak表——weak table(转)

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak references,元素为弱引用的表就叫弱表.有弱引用那么也就有强引用,有引用那么也就有非引用.我们先要厘这些基本概念:变量.值.类型.对象. (1)变量与值:Lua是一个dynamically typed language,也就是说在Lua中,变量没有类型,它可以是任何东西,而值有类型,所以Lua中没

Lua中的weak表——weak table

弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak references,元素为弱引用的表就叫弱表.有弱引用那么也就有强引用,有引用那么也就有非引用.我们先要厘这些基本概念:变量.值.类型.对象. (1)变量与值:Lua是一个dynamically typed language,也就是说在Lua中,变量没有类型,它可以是任何东西,而值有类型,所以Lua中没