1. table.next:原型next(table[,index])
- 当没有传入index即index是nil时,返回的是table表中的第一个键值对
- 当传入index时,返回的是指定index索引的下一个迭代键值对
- 当传入的index为该表的最后一个索引时,返回nil
所以当判断一个表是否为空表{}时可以用if(next(t) == nil)
,而不用再写for语句遍历元素来判断
local t = {}
local s = nil
local o = {"5"}
if next(t) == nil then
logerror("t是空表")
end
--if next(s) == nil then -- 报错
-- logerror("s是空表")
--end
if next(o) == nil then
logerror("o是空表")
end
2. table.pack:原型table.pack(...)
可以将所有参数打包成一个table并返回,方便传递,并在元素的末尾添加一个n键,n键记录了元素的个数
local m = "aaa"
local k = "222"
local v = "bbb"
local t = table.pack(m, k, v)
logerror_tree(t)
logerror_tree(t.n)
3. table.unpack:原型table.unpack(list, i, j)
,i,j可省略分别默认代表第一个和最后一个元素
返回列表中的元素,相当于返回list[i]
, list[i+1]
, ···
, list[j]
local m = "aaa"
local k = "222"
local v = "bbb"
local t = table.pack(m, k, v)
--logerror_tree(t)
--logerror_tree(t.n)
local p, q, r, n = table.unpack(t)
logerror(p, q, r, n)
4. table.move:原型table.move(a1, f, e, t, a2)
将a1表中从索引f到索引e的元素复制到a2表中,从a2表的t索引开始
local m = "aaa"
local k = "222"
local v = "bbb"
local t = table.pack(m, k, v)
--logerror_tree(t)
--logerror_tree(t.n)
--local p, q, r, n = table.unpack(t)
--logerror(p, q, r, n)
local s = {}
table.move(t, 1, t.n, 2, s)
logerror_tree(t)
logerror_tree(s)
5. pcall:原型pcall(f, arg1, ...)
,f是要执行的函数,arg1以及后面是传递给方法f的参数
pcall以一种保护模式执行函数,有两个返回值,第一个返回值表示有无错误,第二个返回值是有错误时的错误信息,pcall可以捕获函数中的任何错误
local function func1(arg)
local a = tonumber(arg)
a = a + 1
end
local ok, error = pcall(func1, "abc")
if ok then
logerror("ok")
else
logerror(error)
end
6. xpcall:原型xpcall(f, msgh, arg1, ...)
当使用pcall的方式调用函数返回时,往往已经销毁了部分调用栈的内容,导致错误信息不够详细,不能更好地帮助我们排查错误,这时候就有了xpcall,xpcall的第二个参数是一个错误处理函数,当错误发生时Lua会在调用栈展开(unwind)前调用这个函数,配合debug.traceback()
能够提供我们更准确的错误信息。注:xpcall只有一个返回值表示是否有错误
local function func1(arg)
local a = tonumber(arg)
a = a + 1
end
--local ok, error = pcall(func1, "abc")
--if ok then
-- logerror("ok")
--else
-- logerror(error)
--end
local ok = xpcall(func1, function() logerror(debug.traceback()) end, "abc")