Lua table操作(table.next, table.pack, table.unpack, table.move, pcall, xpcall)

5 篇文章 0 订阅
4 篇文章 0 订阅

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")

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿斯提尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值