类型和值(二)
最后更新于: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相关,后续随着学习进行会继续深入挖掘。
水平有限,如果有朋友发现错误,欢迎留言交流。
';