类型和值(二)

最后更新于:2022-04-01 20:44:02

## 5.Table Lua的table类型比较强大,用过都知道,它的index不仅可以使用number,还能使用string等其他的值,nil除外。table没有固定的size,你可以动态地向table中添加元素。table是Lua中的主要数据结构。在Lua中,我们用table来表示普通数组,符号表,set,record,queue和其他的lua数据结构。Lua也使用table来表示module,package和其他的对象。当我们写io.read时,我们的意思是“io模块的read函数”,对Lua来说,它理解为“从名为io的table中以‘read’为key进行索引”。 在Lua中,table既不是值,也不是变量,而是对象。你可以理解成一个动态分配的对象,程序通过引用(或指针)来操作它。在后台没有隐藏的副本或者新table的创建(像按值传参那样,操作的是一个新复制的副本)。要创建一个table,只需要一个简单的表达式{ }: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce5eee9a2e2.PNG) table总是匿名的。table本身和存储table的变量,二者之间没有固定的联系: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce5eeeb1a67.PNG) 当程序里不再引用一个table的时候,Lua的垃圾收集器会删除这个table并重用它的内存。 同一个table中可以存储不同index类型的值,并且table的大小可以动态增长 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce5eeecc9c6.PNG) 注意最后一行,像全局变量一样,如果table中未初始化的field值为nil,可以通过赋值nil的方式来删除一个table. 可以在Lua中使用record方式来索引值,a.name这种格式,相当于a["name"]. ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce5eeee5418.PNG) 注意,a.x==a["x"] != a[x] Lua的table的index值从1开始,不是从0,这个要格外注意 下图描述一下Lua的size运算符'#'的用法,它是以table中第一个值为nil的位置为end的,就像C语言的string是以'\0'为end一样,所以,用'#'的话,table中就不能有hole(值为nil的),仔细看下面的图,你会明白的。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-09-06_57ce5eef09993.PNG) 注意最后两句,可以看出'#'和'table.maxn()'的功力。 因为a中第4个位置为nil,因此用'#'算出来就是3,而table.maxn就可以得到5. table.maxn函数打印最大的数字index值 ## 6.Functions Function在lua中是属于first-class值,可以存储到变量中,可以作为参数传递给其他的function,可以作为function的result来return。 Lua中,可以调用用lua或C语言实现的函数。Lua本身就是用C实现的。它实现了string,table,io,math,debug等基本的库,程序可以自己定义其他的函数来扩展功能。 这部分在后续的博客中会继续深入挖掘一下 ## 7.Userdata和Threads userdata类型允许任意的C数据存入到lua的变量中,关于此类型,Lua中没有什么预定义的操作,除了复制和相等比较。此类型是为了表示由程序创建的一些数据类型;例如,io库用userdata类型来表示file。 具体的userdata和thread相关,后续随着学习进行会继续深入挖掘。 水平有限,如果有朋友发现错误,欢迎留言交流。
';