Lua 学习 chapter5

chapter5

Posted by Jow on April 25, 2019

目录

  1. 表索引
  2. 表构造器
  3. 数组、列表和序列
  4. 遍历表
  5. 安全访问
  6. 表标准库
  7. 练习

Work hard, come on baby. This chapter expresses the table.

表索引

a.x 表示的意思和a[“x”]一样,所以前者的可读性更高。

1
2
3
4
5
local a = {}  --空白表,建立了一个表的索引
a.x = 10
a.x --> 10
a.y --> nil
a = nil -->取消对表的索引,然后lua的垃圾处理器就会对其进行回收

表构造器

表构造器是用来创建和初始化表的表达式,也是lua语言中独有的也是最有用、最灵活的机制之一。

在构造表的时候可以使用记录式和列表式,当然你也可以混用它们:

1
2
3
4
5
6
7
8
9
10
11
12
days= {"Mon","Tues","Wednes","Thurs","Fri","Satur","Sun"}
a = {x = 10, y = 100}
poly = {
	color = "blue",
	thickness = 2,
	{x = 0, y = 0}, --polyline[1]
	nppoints = 4,
	{x =2, y =2}, --polyline[2]
	{x = 5, y= 6}, --polyline[3]
	[4] = {x = 7, y =8},
	[6] = {x= 10, y = 10}
}

可以看到在表中你可以使用键值对方式,当然也可以直接存入值(或者整数作为元素的索引)。直接存入值的地方就可以通过整数来索引像上面的表索引的那样。

使用ipairs循环打印的时候,使用整数索引的值能够被打印出来,正如顺序构造的那样。

当分别使用ipairs和pairs进行循环遍历的时候,我们会发现其中的特点。这说明表的存储结构,它是由数组部分和hashtable部分组成的,在输出的时候数组的部分会被优先输出,之后是hashtable部分。

其中ipairs只会遍历数组部分,而pairs会遍历所有部分。

ipairs遍历的时候只会从1开始,直到顺序断开,pairs的遍历是乱序的,不能保证的

当然你也可以使用特定的数字来作为表的索引,需要使用中括号,如上例[4]就能被ipairs遍历到,但是[6]就不行,因为不连续。

数组、列表和序列

在table中,想表示常见的数组或者列表,那么只需要使用整形作为索引的表即可。

当然当列表中不存在nil的时候这样的数组可以被称之为序列。

更准确的说序列是由指定的n个正整数为键值组成的[1…n]的集合。在中间既不能存在空洞(值为nil或者干脆没有键值直接越到后面的整数去),这样通过#访问数组的长度只会返回空洞之前的有效长度。

遍历表

  1. ipairs 针对于序列,顺序输出
  2. pairs 针对于所有表,输出所有元素,但是不保证顺序(因为存储方式为hashtable)
  3. for i = 1, #t do print(t[i]) end 使用for循环

安全访问

可以通过or来实现安全访问:

1
2
E = {}
zip = (((company or E).director or E).address or {}).zipcode 

这样不会报错,最后返回的值也是nil,而且还减少了对表的访问。

表标准库

  1. table.insert(t,pos,val) –>向指定的位置插入一个值,当然也可以不指定位置,就会直接在最后插入
  2. table.remove(t,pos) –> 移除指定位置的元素,如不指定,移除最后一位,移除之后后面的元素会自动前移
  3. table.move(a,f,e,t) –> 将表a中,从f到e的元素移到从t开始的位置
  4. table.move(a,f,e,t,{}) –> 将a表中从f到e的元素移动到新表{},从t开始的位置
  5. table.concat(“hello”,” world”) –> hello world 连接字符串
1
2
3
4
5
6
7
8
9
10
11
12
local t2 = { 1, 2, 3, 4, 5, 6, 7 }
local t3 = {}
table.insert(t3, 1)
table.move(t2, 1, #t2, 2)
table.move(t2, 1, #t2, 2, t3)
for i, v in ipairs(t2) do
    print(t2[i])
end

for i, v in ipairs(t3) do
    print(t3[i])
end

练习

1
2
3
4
5
a={}
a.a = a
print(a.a.a)
a.a.a.a = 3
print(a.a.a)

在赋值3之前无论打印那个a他们都指向的是那张空表,当赋值之后a.a 指向3,所以a.a.a即3.a会报错