lua之table的使用

转载自:https://blog.csdn.net/cindyxue_17/article/details/106940135

本文对从数据结构,存储和使用三个角度对lua之table的使用进行小结。

数据结构:
table是lua的一种数据结构,可以用来存放各种类型的元素,例如可以创建数组和字典,以及二者混合的数据结构,
例如:
a={“hello”,“world”,“lua”} --数组
b={a=“hello”,b=“world”,c=“lua”} --字典
c={“hello”,b=“world”,“lua”} --数组元素和字典元素混合
存储:
lua的table使用数组和哈希表结合的方式,使用string或者0和负数做key时,key都是保存在哈希段,使用正整数或没有key值的值,都保存在数组区
如果以正整数作为key存储的key,与索引重复,则以索引的值为准
例如对于如下定义的table
local a={[3]=“world”,“my”,[2]=“hello”,“lua” }

demo 

输出如下:

output 

遍历方式:
table的遍历方式有两种,由于table的数据结构比较灵活,所以其遍历方式也存在差别,下面从两种遍历方式的区别来梳理table的遍历规则
3.1 ipairs只会输出有索引的数据,table不会给键值对一个索引,因此不会输出键值对,而pairs会输出table中的值和键值对,先顺序输出值,再乱序(键的哈希值)输出键值对。这是因为,table在存储值的时候是在数组区按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,并不会按照键的字母顺序或是数字顺序存储
例如对于如下定义的table,两种遍历方式的输出分别如下:
local a={“hello” ,b=“world”,“my”,“lua”}
ipairs方式:

demo2 

输出:

output1

 

pairs方式:

demo3 

输出:

output3

 

3.2 ipairs遇到nil停止,pairs遇到nil继续
例如对于如下定义的table
local a={“hello” ,b=“world”,“my”,nil,“lua”}
ipairs方式:

demo4

 

输出:

output4 

pairs方式:

demo5 

输出:

output5

 

3.3 以正整数作为key值定义的元素,key可以作为索引,将值存储在数组区,ipairs会根据key的数值从1开始加1递增遍历对应的table[i]值,直到出现第一个不是按1递增的数值时候退出;此时用pairs遍历键值时,依然是乱序输出,并不会按照索引顺序输出,而是与key的哈希值有关系,如1中所讲table在存储值的时候是按照顺序的,但是在存储键值对的时候是按照键的哈希值存储的,并不会按照键的字母顺序或是数字顺序存储
例如对于如下定义的table
local a={[4]=“hello” ,[5]=“world”,“my”,[2]=“lua”}
ipairs方式:

demo6 

输出:

output6 

pairs方式:

demo7 

输出:

output7 

Lua中table和json的转换
在lua中编写的服务器中,客户端发送的数据往往是json格式,那么在lua中就需要转换成lua自己的数据结构进行解析,如table。同样在如果lua希望通过json来发送一些业务数据,则同样需要将table转化为json格式。
cjson可以实现table和json的转换,使用方式如下
–引入cjson模块
local cjson = require(“cjson”)
local cjson=cjson.new()
–将lua中的table类型的数据转换为json格式
table_data={name=”xiaoxiao”,age=12}
post_data=cjson.encode(table _data)
–post_data={“name”:”xiaoxiao”,”age”:18}
–将json格式的数据转换为lua的table
table _data= cjson.decode(post_data)
– table _data={name=”xiaoxiao”,age=12}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值