Lua 学习 chapter5
<h3 id="目录">目录</h3>
- 表索引
- 表构造器
- 数组、列表和序列
- 遍历表
- 安全访问
- 表标准库
- 练习
表索引
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或者干脆没有键值直接越到后面的整数去),这样通过#访问数组的长度只会返回空洞之前的有效长度。
遍历表
- ipairs 针对于序列,顺序输出
- pairs 针对于所有表,输出所有元素,但是不保证顺序(因为存储方式为hashtable)
- 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,而且还减少了对表的访问。
表标准库
- table.insert(t,pos,val) –>向指定的位置插入一个值,当然也可以不指定位置,就会直接在最后插入
- table.remove(t,pos) –> 移除指定位置的元素,如不指定,移除最后一位,移除之后后面的元素会自动前移
- table.move(a,f,e,t) –> 将表a中,从f到e的元素移到从t开始的位置
- table.move(a,f,e,t,{}) –> 将a表中从f到e的元素移动到新表{},从t开始的位置
- 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会报错
<hr style="visibility: hidden;">