|
这一章节内容:Table、模块与包这两方面的知识,至此Lua的基础语法部分就到这,下部分是Lua的面向对象,Lua的垃圾回收原理,Lua的核心与设计等,再到最后就是如何使用开源的XLua试先我们自己项目的热更功能。
9.Table
--[[
table是Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。
]]--
-- Table的声明
mytable = {}
-- Table的赋值
mytable[1] = "Lua"
mytable[2] = 123
mytable[3] = 'a'
-- Table的遍历 !!!#Table如果获取的是无序的Table的话返回的值会是0,#只能获取有序长度(1,2,3,4,5)的Table
for i=1,#mytable do
print(mytable)
end
-- Table的索引值可以是不唯一的类型,可以是整形或字符串或小数等等
mytable["123"] = "222"
print(mytable["123"])
mytable[1.1] = 2.2
print(mytable[1.1])
mytable = nil
-- 简单的 table
mytable = {}
-- 输出:mytable 的类型是 table
print("mytable 的类型是 ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "修改前"
-- 输出:mytable 索引为 1 的元素是 Lua
print("mytable 索引为 1 的元素是 ", mytable[1])
-- 输出:mytable 索引为 wow 的元素是 修改前
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- alternatetable和mytable的是指同一个 table
alternatetable = mytable
-- 输出:alternatetable 索引为 1 的元素是 Lua
print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
-- 输出:mytable 索引为 wow 的元素是 修改前
print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])
alternatetable["wow"] = "修改后"
-- 输出:mytable 索引为 wow 的元素是 修改后
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- 释放变量
alternatetable = nil
-- 输出:alternatetable 是 nil
print("alternatetable 是 ", alternatetable)
-- mytable 仍然可以访问
-- 输出:mytable 索引为 wow 的元素是 修改后
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
mytable = nil
-- 输出:mytable 是 nil
print("mytable 是 ", mytable)
-- *table.concat方法的使用
animals = {"cat", "dog", "bird"}
-- 单纯的使用table.concat(animals)的话会把表里面的所有内容全部衔接起来
-- 输出:catdogbird
print(table.concat(animals))
-- 如果只填写两个参数, 参数1 表, 参数2 分隔符
-- 输出:cat, dog, bird
print(table.concat( animals, ", "))
-- 如果参数填写满, 参数1 表, 参数2 分隔符, 参数3 表的起始遍历位置, 参数4 表的停止遍历位置
print(table.concat( animals, ", ", 2, 3))
fruits = {"banana","orange","apple"}
-- 返回 table 连接后的字符串
-- 输出:bananaorangeapple
print("连接后的字符串 ",table.concat(fruits))
-- 指定连接字符
-- 输出:banana, orange, apple
print("连接后的字符串 ",table.concat(fruits,", "))
-- 指定索引来连接 table
-- 输出:orange, apple
print("连接后的字符串 ",table.concat(fruits,", ", 2,3))
-- *我们如果只填三个参数的话会默认从起始位到表的最后一位
-- 例如:
number = {"1","2","3","4","5"}
-- 下面这两行语句的结果都是一样的,代表的一个意思
-- 输出:
-- 连接后的字符串 2,3,4,5
-- 连接后的字符串 2,3,4,5
print("连接后的字符串 ",table.concat(number, ",", 2))
print("连接后的字符串 ",table.concat(number, ",", 2, #number))
-- Table的插入和删除的方法
-- 这种写法会默认是在Table的末尾插入
table.insert(fruits,"mango")
-- 输出:索引为 4 的元素为mango
print("索引为 4 的元素为 ",fruits[4])
-- 在索引为 2 的键处插入
table.insert(fruits,2,"grapes")
-- 输出:索引为 2 的元素为grapes
print("索引为 2 的元素为 ",fruits[2])
-- 输出:最后一个元素为 mango
print("最后一个元素为 ",fruits[5])
-- 把最后一个元素移除
table.remove(fruits)
-- 输出:移除后最后一个元素为nil(不存在的默认都输出为nil)
print("移除后最后一个元素为 ",fruits[5])
-- 删除Table的指定索引的值
for i=1,#fruits do
-- 输出:
-- banana
-- grapes
-- orange
-- apple
print(fruits)
end
print("当前剩余的:")
table.remove(fruits, 2)
for i=1,#fruits do
-- 输出:
-- banana
-- orange
-- apple
print(fruits)
end
-- Table的排序
fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
-- 输出:
-- 1 banana
-- 2 orange
-- 3 apple
-- 4 grapes
rint(k,v)
end
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
-- 输出:
-- 1 apple
-- 2 banana
-- 3 grapes
-- 4 orange
print(k,v)
end
-- 寻找Table的最大值
--[[
Table 最大值
table.maxn 在 Lua5.2 之后该方法已经不存在了,我们定义了 table_maxn 方法来实现。
以下实例演示了如何获取 table 中的最大值:
]]--
function table_maxn(t)
local mn=nil;
for k, v in pairs(t) do
if(mn==nil) then
mn=v
end
if mn < v then
mn = v
end
end
return mn
end
tbl = {[1] = 2, [2] = 6, [3] = 34, [26] =5}
-- 输出:tbl 最大值:34
print(&#34;tbl 最大值:&#34;, table_maxn(tbl))
-- 输出:tbl 长度:3
print(&#34;tbl 长度 &#34;, #tbl)
--[[
-- 注意:
-- 当我们获取 table 的长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数,而导致无法正确取得 table 的长度。
-- 可以使用以下方法来代替:
function table_leng(t)
local leng=0
for k, v in pairs(t) do
leng=leng+1
end
return leng;
end
]]--
word = {&#34;a&#34;, &#34;b&#34;, &#34;c&#34;, &#34;d&#34;, &#34;e&#34;}
function table_max(t)
for k, v in pairs(t) do
print(k .. &#34; &#34; .. v)
end
end
table_max(word)
function table_len(t)
-- 注意这里一定要赋个初始值0不然会报nil错误
local length = 0
for k, v in pairs(t) do
length = length + 1
end
return length
end
-- 输出:5
print(table_len(word))
--[[
-- *小坑:
-- pairs可以遍历表中所有的key,value, 可以返回nil
-- ipairs从下标为1开始遍历,然后下标累加1,如果某个下标元素不存在就终止遍历。不一定能遍历到所有的元素
-- 如果下标不连续或者不是从1开始的表就会中断或者遍历不到元素
]]--
local table1 = {
[1] = &#39;11&#39;,
[2] = &#39;22&#39;,
[&#39;GOD&#39;] = &#39;love&#39;,
[5] = &#39;55&#39;,
}
-- table1 pairs
for k, v in pairs(table1) do
print(k.. &#39; &#39;.. v)
end
-- table1 ipairs
for k, v in ipairs(table1) do
print(k.. &#39; &#39;.. v)
end
local table1 = {
[1] = &#39;11&#39;,
[2] = &#39;22&#39;,
[&#39;GOD&#39;] = &#39;love&#39;,
[5] = &#39;55&#39;,
}
-- table1 pairs
for k, v in pairs(table1) do
-- pairs会遍历索引的key-value所以会打印出来table所有的值
-- 不存在的值也会报nil
-- 输出:
-- 1 11
-- 2 22
-- 5 55
-- GOD love
print(k.. &#39; &#39;.. v)
end
-- table1 ipairs
for k, v in ipairs(table1) do
-- ipairs跟pairs不一样的是如果是不连续的或者不是从1开始遍历的
-- 会发生中断或者遍历不到下一个元素,因为ipairs是从下标索引值为1开始遍历
-- 输出:
-- 1 11
-- 2 22
print(k.. &#39; &#39;.. v)
end
-- 再看最后一道测试例子
local table2 = {
&#39;love&#39;, --table默认是index递增的insert
&#39;is&#39;,
[3] = &#39;gift&#39;,
[&#39;mom&#39;] = &#39;love&#39;
}
-- table2 pairs
for k, v in pairs(table2) do
-- 输出
-- 1 love
-- 2 is
-- 3 gift
-- mom love
print(k.. &#39; &#39;.. v)
end
print(&#39;\n&#39;)
-- table2 ipairs
for k, v in ipairs(table2) do
-- 输出
-- 1 love
-- 2 is
-- 3 gift
print(k.. &#39; &#39;.. v)
end10.模块与包
--[[
-- 首先,先介绍Lua的模块
]]--
-- 一.先看下例子:
-- 先创建一个文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = &#34;这是一个常量&#34;
-- 定义一个函数
function module.func1()
io.write(&#34;这是一个公有函数!\n&#34;)
end
local function func2()
print(&#34;这是一个私有函数!&#34;)
end
function module.func3()
func2()
end
return module
-- 二.创建一个test_module.lua 文件
-- module 模块为上文提到到 module.lua
require(&#34;module&#34;)
-- 输出
-- 这是一个常量
-- 这是一个公有函数!
-- 这是一个私有函数!
print(module.constant)
module.func1()
module.func3()
print(&#34;\n&#34;)
-- test_module2.lua 文件
-- module 模块为上文提到到 module.lua
-- 别名变量 m
local m = require(&#34;module&#34;)
-- 输出:
-- 这是一个常量
-- 这是一个公有函数!
-- 这是一个私有函数!
print(m.constant)
m.func1()
m.func3()参考资料:
1.Lua table(表) | 菜鸟教程 (runoob.com)
2.Lua 5.3 参考手册 (cloudwu.github.io)
3.Lua table遍历pairs和ipairs的区别_小天使faith的专栏-CSDN博客
4.Lua local 变量的使用(简单梳理)_蚂蚁码代码-CSDN博客 |
|