【Lua基础系列】之类型与值(表 Table)详细版

               【Lua基础系列】之类型与值 (表Table)

 

       大家好,我是Lampard~~

       欢迎来到Lua基础系列的博客

       PS:本博客知识参考资料为:《Lua程序设计第四版》,该书由Lua的创始人2018年所编著,所以大家可以放心去吸收知识

 

      前文再续,书接上一回。

      今天要接着讲Lua中的基本类型table。

      

   (一)表Table类型

      表是Lua语言中最强大也是唯一的数据结构。使用表,Lua语言可以以一种简单,统一且高效的方式表示数组,集合,记录和其他很多的数据结构。

      Lua语言中的表本质是一种辅助数组,这种数组不仅可以通过数字下标作为索引,也可以通过使用字符串或其他任意类型的值来映射相对应的值(键值对)。

 

    我们使用构造器表达式创建表,其最简单的形式是{}  

a = {} -- 创建了一个空表

k = “x”

a[k] = 10 -- 这句话的意思是a["x"]=10,键是“x”,值是10,此时我们可以通过a.x和a["x"]访问到10

a[10] = "Hello Table" --这句话的意思是,索引是10,值是字符串“Hello Table”

    表永远是匿名的,表本身和保存表的变量之间没有固定的关系。当没有变量指向表的时候,Lua会对其进行自动回收

a = {}                       -- a指向一个空表
a["x"] = 10                  -- a的"x"键赋值为10
b = a                        -- b指向a这个表
print(b["x"])                -- 此时答案为10
b["x"] = 20                    
print(a["x"])                -- 此时答案为20
                             -- 说明a和b指向的是同一张表,并没有进行深拷贝
a=nil                        -- 只剩下b指向这张表
b=nil                        -- Lua自动回收

   (1)表索引

    同一个表中存储的值可以有不同的类型索引:既不同类型的键。未经初始化的表元素为nil。

    当把表当做结构体使用时,可以把索引当做成员名称使用。

 2-1

   对于Lua语言而言,这两种形式是等价的。但是对于阅读程序的人而言,这两种形式分别代表了两种意图:当你用a.name来赋值时,清洗地说明了把表当做结构体使用,此时的标识由预先定义的键组成的集合。而使用a【“name”】来赋值,则说明了表可以使用任意字符串当做键

  

   (2)表构造器

    除了使用空构造器{}构造表之外我们还可以这样做:

    注意:Lua中默认值是从1开始

days = {“Monday”,“Tuesday”,“Wednesday”,“Thursday”,“Friday”,“Saturday”,“Sunday”}
       --[[ 此时days[1]到days[7]被默认定义为“Monday”~“Sunday” ]]

   Lua语言还提供了一种初始化记录式表的特殊语法:

a = {x = 10 , y = 20}
-- 上面的写法等价于 a["x"]=10,a["y"]=20

  在同一个构造器中,可以混用记录式和列表式写法;

polyLine = {

           color = "blue",                 
           thickness = 2,
           npoints = 4,
           {x=0,y=0},                   --[[ 类似二维数组,此时polyLine[1]={x=0,y=0}
           {x=-10,y=1},                                    polyLine[2]={x=-10,y=1}
           {x=0,y=1}                                       polyLine[3]={x=0,y=1] ]]

            }

  (3) 数组,列表和序列

    如果想表示常见的数组或者列表,那么只需要使用整形作为索引的表即可。当该表不存在空洞,既表中的所有数据都不为nil时,则成这个表为序列(sequence)

    Lua语言提供了获取序列长度的操作符#。正如我们之前所看到,对于字符串而言,该操作符但会字符串的字节数。对于表而言,则会返回序列的大小

22

因而,当我们想在序列后增加元素时则可以使用语句 a[#a+1]=new

23

 

  (4) 遍历表

   我们可以使用pairs迭代器遍历表中的键值对。遍历过程中元素出现的顺序可能是随机的,相同的程序在每次运行时也可能产生不同的顺序。唯一可以确定的是,在遍历的过程中每个元素会且只会出现一次

  24

  对于序列而言我们可以使用ipairs迭代器:此时Lua确保是按顺序进行的

25

 

(5)表标准库

 表标准库提供了操作列表和序列的一些常用函数。

今天简单介绍增加(insert)删除(remove),移动move(),以及排序(sort)。

 

  table.insert ()

 insert()有两种格式,一种是两个参数,insert(tableName,元素),这种情况下就会默认插到末尾

 另一种是三个参数(tableName,位置,元素),则可以按照自己的想法插入元素。

27

 

table.remove()

删除指定位置的元素,并把后面的元素往前移动填充删除所造成的空洞

28

 

table.move(tableA,起始索引,终止索引,tableB)

它的作用时把表A中从起始索引到终止索引的值移动到表B中

 

table.sort()

这个就是单纯的排序方法。

29

 

 OK,今天的博客就到这里,谢谢大家!!!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值