Lua打表

该文章提供了一个名为print_r的Lua函数,用于以可读的方式递归打印表格结构。通过sub_print_r辅助函数,它遍历并打印表格中的键值对,特别处理了嵌套表格和字符串的情况。示例展示了如何使用这个函数来打印包含嵌套表格的记录。

参考:https://www.likecs.com/show-308547984.html


function print_r(t)
    local print_r_cache={}
    local function sub_print_r(t,indent)
		if (type(t)=="table") then
			for pos,val in pairs(t) do
				if (type(val)=="table") then
					print(indent.."["..pos.."] = "..tostring(t).." {")
					sub_print_r(val,indent..string.rep(" ",string.len(pos)+8))
					print(indent..string.rep(" ",string.len(pos)+6).."}")
				elseif (type(val)=="string") then
					print(indent.."["..pos..'] = "'..val..'"')
				else
					print(indent.."["..pos.."] = "..tostring(val))
				end
			end
		else
			print(indent..tostring(t))
		end
    end
    if (type(t)=="table") then
        print(tostring(t).." {")
        sub_print_r(t,"  ")
        print("}")
    else
        sub_print_r(t,"  ")
    end
    print()
end
local record1 = {
	["key"] = 1,
	["value"] = 2
}
local record2 = {
	["key"] = 3,
	["value"] = 4
}
local record3 = {record1,record2}
local record = {["where"] = record3}
print_r(record)
Lua 元表是一个普通的 Lua 表,包含一组元方法,这些元方法与 Lua 中的事件相关联,事件发生在 Lua 执行某些操作时,例如加法、字符串连接、比较等。每个值都可具有元表,元表定义了原始值在某些特定操作下的行为,可以通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。例如,当数字值作为加法的操作数时,Lua 检查其元表中的 `"__add"` 字段是否有个函数,如果有,Lua 调用它执行加法[^1][^2]。 #### 元表的基本操作 在 Lua 中,可以使用 `getmetatable` 函数来查询任何一个值的元表,使用 `setmetatable` 函数来替换掉 table 的元表。不过,在 Lua 代码中只能设置 table 的元表,其它类型值的元表只能在 C 代码中设置。每个 table 和 userdata 拥有独立的元表(多个 table 和 userdata 也可以共享一个相同的表作它们的元表),其它所有类型的值,每种类型都分别共享唯一的一个元表。Lua 在创建新 table 时默认不会创建元表,一个 table 也可以作为自己的元表[^5]。 ```lua -- 创建一个表 local myTable = {} -- 创建一个元表 local myMetaTable = {} -- 设置元表 setmetatable(myTable, myMetaTable) -- 获取元表 local meta = getmetatable(myTable) print(meta == myMetaTable) -- 输出 true ``` #### 常见元方法 - **__index 元方法**:Lua 读取表中元素时,如果在表中找不到该元素,会判断该表是否有元表,如果没有元表,返回 `nil`,有元表则继续判断元表有没有 `__index` 方法,如果 `__index` 方法为 `nil`,则返回 `nil`;如果 `__index` 方法是一个表,则重复上述查找规则;如果 `__index` 方法是一个函数,Lua 会以表和键为参数调用该函数,并返回该函数的返回值[^4]。 ```lua local defaultTable = { a = 10, b = 20 } local myTable = {} local meta = { __index = defaultTable } setmetatable(myTable, meta) print(myTable.a) -- 输出 10 ``` - **__newindex 元方法**:当对表中不存在的索引赋值时,Lua 会检查元表中是否有 `__newindex` 方法。如果有,则调用这个方法,而不进行赋值操作;如果没有,则直接进行赋值。 ```lua local myTable = {} local meta = { __newindex = function(t, k, v) print("Setting " .. k .. " to " .. v) end } setmetatable(myTable, meta) myTable.c = 30 -- 输出 Setting c to 30 ``` - **__add 元方法**:用于定义两个表相加的行为。 ```lua local t1 = {1, 2, 3} local t2 = {4, 5, 6} local meta = { __add = function(tab1, tab2) local result = {} for i = 1, #tab1 do result[i] = tab1[i] + tab2[i] end return result end } setmetatable(t1, meta) setmetatable(t2, meta) local sum = t1 + t2 for _, v in ipairs(sum) do print(v) end ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

HHT0506

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

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

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

打赏作者

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

抵扣说明:

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

余额充值