差不多将近一个半月没更新博客了…之前一直忙着期末考试复习,没啥额外的学习输出。最近开始实习了,公司里的游戏项目大半都是用Lua写的,之前也没有学过lua语言,所以就对lua的一些知识概念点进行一个复习总结,今天先讲讲table吧。
学习资源均来自网上,看的最多的就是菜鸟教程上的。
一.什么是Table
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
- 我们绝大部分在使用lua语言的时候,都会遇到table的各种情况,table作为lua的数据结构可以灵活多变,接下来会介绍一些基本的使用。
二.Table的使用
构造Table最简单的方式就是
-- 初始化table
mytable = { }
-- 指定值
mytable[1] = "Lua"
-- 垃圾回收table
mytable = nil
从最简单的table运用来看,你可以把table当成数组。
mytable = { "C" , "C#" , "Java" , "Lua" }
而调用则是根据学过的许多语言一样,通过索引来进行访问。
print(mytable[0]) -- 结果为nil
print(mytable[1]) -- 结果为 C
细心的朋友会发现到,Lua中的索引是从1开始的。当然你如果想从0开始也可以的,就是麻烦了点
mytable = {[0] = "C" , [1] = "C#" , ...}
print(mytable[0]) -- 结果为 C
print(mytable[1]) -- 结果为 C#
接着再介绍一点Lua中自带的Table操作
- 1.table.concat(table , sep , start , end): concat是连接的缩写,该函数作用是将table中从索引为start到end的所有元素以sep分隔符进行分割。
举个例子
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",...}
print(table.concat(mytable,",",0,2))
-- 输出 C,C#,Java
- 2.table.insert (table, pos ,value): insert就是插入的意思,该函数就是将table索引为pos的元素前面添加一个value元素,当然这里pos参数可以不写,默认就为table末尾。
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",...}
table.insert(mytable,3,"Lua")
print(mytable[3])
-- 输出 Lua
-- 这个函数就等于告诉你 mytable [pos] = value
- 3.table.maxn(table):指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了)
这个函数我用到的不多…就是求table中最大正key值(最大索引)
mytable = {[0] = "C" , [1] = "C#" , [2] = "Java",[5]="PHP"}
print(table.maxn(mytable))
-- 输出 5
- 4.table.remove(table,pos):
返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。 - 5.table.sort (table,cmp)
对给定的table进行升序排序。cmp参数可选,可以自定义排序比较函数。
都说到排序了,那就做个小练习吧,用Lua编个冒泡排序
-- 冒泡排序
function bubble_sort(tab)
for i = 1 , #tab do -- #所取的长度是从索引为1开始,直到遇到第一个nil value
for j = 1 , #tab-1 do
if( tab[j]>tab[j+1]) then
tab[j],tab[j+1] = tab[j+1],tab[j] -- 两数交换
end
end
end
end
mytable = { 23, 35, 67, 12, 44, 85 }
bubble_sort(mytable)
for _,v in pairs(mytable) do
print(v)
end
--[[
输出
12
23
35
44
67
85
]]--
这里额外说一点的是获取table的长度时,如果是对于普通的数组例如上面的纯数字数组是可以直接通过 # 去获取的,但是#会从索引1开始,并在索引中断的地方停止记数。
mytable = {[0] = "C" , [1] = "C#" , [2] = 152,["3"]="3",[28]=123}
print( #mytable )
-- 输出 2
--(长度只记录索引1和2 之后索引就不是连续的了。)
print( mytable["3"] )
-- 输出 3
-- (["3"]="3" 是通过键值对的形式来表示的)
上面提到了键值对,这也是Table在lua经常充当字典的原因。
mytable = { ["1"] = "Chinese" , ["2"] = "American" , ["3"] = "Japanese" }
print(mytable ["1"])
由于Lua中对Table中value的数据类型没有限定,所以你可以放任何你能想到的。
-- table和函数挂钩
function fun1()
return "this is fun1"
end
mytab1= { ["fun1"] = fun1() }
print(mytab1["fun1"])
-- 输出 this is fun1
-- table和table之间挂钩
function fun1()
return "this is fun1"
end
mytab1= { ["fun1"] = fun1() }
mytab2= { ["tab1"] =mytab1}
print(mytab2["tab1"] ["fun1"])
-- 输出 this is fun1
其实可以把table就想象成一个快递中心(地址),你手机收到的取货号就好比索引或者key键,你的快递就是相应的value值,就是根据你的取货号一一对应的。
三.结尾
table的基础内容差不多也就这些了吧,如果以上内容有问题的可以评论指出啊~刚开始学,希望大家一起努力!两三天之内更新metatable的内容,metatable元表的内容可是需要花很长时间去理解的,所以我会尽量写的时候通俗易懂点,溜了溜了!