lua中的table
Lua表格就是键值对, 可以嵌套
Luau类似json, json字符串的key要加引号, lua不能加, json数字key可以直接写, lua要加在数字外面加[], lua的key与值都可以是数字, 字符, 协程, 函数.
Lua表格赋值给另一个表格时, 其实是引用, 没有值复制
-- 创建一个表 local originalTable = {key = "value"} -- 将原始表赋值给另一个变量 local copiedTable = originalTable -- 修改复制的表 copiedTable.key = "new value" -- 打印原始表的值 print(originalTable.key) -- 输出: new value
如果想值复制表格, 这样修改复制表, 就不会影响原来的值
local originalTable = {key = "value"} local copiedTable = table.copy(originalTable)
Lua遍历有两种ipiars一般用作数组, 就是默认key不写, pairs遍历是键值遍历
local mytable = { -- 字符做key, 不能加引号, 值要加引号(单引号, 双引号都可以) -- 数字做key, 要加[] -- lua每组键值对, 可以用,或;分隔 hello = "hello", world = 'world'; -- 没有指定key, 默认key为整数1 { x = 100, y = 100 }, -- 没有指定key, key为整数2 { x = 200, y = 200 }, [10] = 10, [15] = "num 15" } print("mytable length:", #mytable) -- ipairs用来遍历连续的数组, 从1开始, 如果中间断了, 不会遍历到后面的 print("ipairs:") for index, value in ipairs(mytable) do print("index:", tostring(index), ", value:", tostring(value)) end print("pairs:") -- pairs可以遍历所有的key, value for key, value in pairs(mytable) do print("key:", tostring(key), ", value:", tostring(value)) end
输出结果:
mytable length: 2 ipairs: index: 1 , value: table: 0x21c36c0 index: 2 , value: table: 0x21c3750 pairs: key: 1 , value: table: 0x21c36c0 key: 2 , value: table: 0x21c3750 key: world , value: world key: 15 , value: num 15 key: 10 , value: 10 key: hello , value: hello
另一种遍历:
local pairCount = 2 local joinQueue = {1,2,3,4,5} --i初始值为5, 每次减2, 如果i的值大于等于1时, 循环体可以执行 for i = #joinQueue, 1, -pairCount do local item1 = joinQueue[i] local item2 = joinQueue[i-1] print(item1, item2) table.remove(joinQueue, #joinQueue) --这儿修改表格不会影响i的值 table.remove(joinQueue, #joinQueue) end --输出如下: 每次取尾巴两个值 --5 4 --3 2 --1 nil
学习测试时, 建议网上搜索"在线lua测试", 可以直接测试.
lua 调用函数只有一个参数时, 参数是字符串或表格, 可以不用括号, 表格的key为数字要加方括号, 可参见下面的表格打印
print('hello') 与 print 'hello' 相等, 参数为一个table时没测试
打印完整表格:
local function print_table(t) local print_cache = {} local function sub_print(t, indent) if print_cache[tostring(t)] then print(indent .. "*" .. tostring(t)) else print_cache[tostring(t)] = true if type(t) == "table" then for key, val in pairs(t) do -- key可能是function 或 thread, 转成key_name字符串 local key_name = tostring(key) local val_type = type(val) if val_type == "table" then print(indent .. "[" .. key_name .. "] => " .. "{") sub_print(val, indent .. string.rep(" ", string.len(key_name) + 8)) print(indent .. string.rep(" ", string.len(key_name) + 6) .. "}") elseif val_type == "string" then print(indent .. "[" .. key_name .. '] => "' .. val .. '"') else print(indent .. "[" .. key_name .. "] => " .. tostring(val)) end end else print(indent .. tostring(t)) end end end if type(t) == "table" then print("{") sub_print(t, " ") print("}") else sub_print(t, " ") end end local tbl = { [1] = 5, [3] = 'test', ['a'] = 77543, [2] = { ['t'] = 9, ['moon'] = 1, [4] = {['thou'] = 1000, ['w'] = 10000, [143] = 'girl'}, ['what'] = 'why'}, ['apple'] = 4 } local function test() print("hello") end -- 字符串"test"]为key, value为函数, 与tbl["test"] = test相同效果 tbl.test = test -- 函数做为key, 值为字符串 tbl[test] = "my key is function" local co = coroutine.create(function() print("hello coroutine") end) table.insert(tbl, co) -- 协议作为key tbl[co] = "my key is coroutine!" print_table(tbl)
打印结果:
{ [1] => 5 [2] => { [moon] => 1 [t] => 9 [what] => "why" [4] => { [thou] => 1000 [w] => 10000 [143] => "girl" } } [3] => "test" [4] => thread: 0x24ea108 [a] => 77543 [apple] => 4 [thread: 0x24ea108] => "my key is coroutine!" [function: 0x24ea050] => "my key is function" [test] => function: 0x24ea050 }
打印所有(表格, 单独类型, 都可以):
function print_all(...) for i, t in ipairs({...}) do if type(t) ~= 'table' then print(tostring(t)) else print_table(t) end end end print_all({a = 5, b = "ccc"}, tbl, 4)
打印结果:
{ [b] => "ccc" [a] => 5 } { [thread: 000002350A5A6128] => "my key is coroutine!" [1] => 5 [2] => { [what] => "why" [moon] => 1 [t] => 9 [4] => { [thou] => 1000 [143] => "girl" [w] => 10000 } } [3] => "test" [test] => function: 000002350BE82920 [4] => thread: 000002350A5A6128 [apple] => 4 [a] => 77543 } 4
lua表增加元素, 可以如上面tbl.test = 值, 这儿test当成字符串了, 如果key为其它类型要加[], 如果数字, 协程, 函数,都要加[], 参照上面.
lua表删除元素, 如果是列表, 可以使用table.remove(listTab, pos), 返回删除的值; 如果不是列表, 使用piars遍历, 设置指定key的值为nil, 就可以了
function deleteKey(t, key) for k, v in pairs(t) do if k == key then t[key] = nil return true end end return false end
table.concat 函数用于将一个数组(table)中的元素连接成一个字符串
local words = {"Hello", "world", "from", "Lua"} local sentence = table.concat(words, " ") print(sentence) -- 输出 "Hello world from Lua"
table.move 函数用于将一个表(table)中的元素移动到另一个表或同一表的不同位置。它接受五个参数:源表、源表的起始索引、源表的结束索引、目标表的起始索引和目标表(可选,如果未提供,则默认为源表)。
local t = {1, 2, 3, 4, 5, 6, 7, 8, 9} table.move(t, 2, 4, 6) --t:{1, 5, 6, 7, 8, 9, 2, 3, 4} for i, v in ipairs(t) do print(i, v) end
--输出
1 1
2 2
3 3
4 4
5 5
6 2
7 3
8 4
9 9
table.pack 和 table.unpack 函数分别用于将一组值打包成一个表(table)和将一个表中的值解包成一组值。
local values = table.pack(1, 2, 3, 4, 5) for i, v in ipairs(values) do print(i, v) end --[[输出 1 1 2 2 3 3 4 4 5 5 ]] local values = {1, 2, 3, 4, 5} local a, b, c = table.unpack(values, 2, 4) print(a, b, c) -- 输出 "2 3 4"