转载自:http://blog.csdn.net/lixianlin/article/details/24739499
会PHP的人都知道PHP中的print_r/var_export函数,可以方便的用于打印数组或导出变量,Lua中没有提供,实际应用中却是很多时候需要类似的功能。
今天便封装了个简单函数,实现类似功能,用来打印/导出table:
-- dump.lua
--[[
dump对象
@param mixed obj
@return string
]]
function debug.dump(obj)
local getIndent, quoteStr, wrapKey, wrapVal, isArray, dumpObj
getIndent = function(level)
return string.rep("\t", level)
end
quoteStr = function(str)
str = string.gsub(str, "[%c\\\"]", {
["\t"] = "\\t",
["\r"] = "\\r",
["\n"] = "\\n",
["\""] = "\\\"",
["\\"] = "\\\\",
})
return '"' .. str .. '"'
end
wrapKey = function(val)
if type(val) == "number" then
return "[" .. val .. "]"
elseif type(val) == "string" then
return "[" .. quoteStr(val) .. "]"
else
return "[" .. tostring(val) .. "]"
end
end
wrapVal = function(val, level)
if type(val) == "table" then
return dumpObj(val, level)
elseif type(val) == "number" then
return val
elseif type(val) == "string" then
return quoteStr(val)
else
return tostring(val)
end
end
local isArray = function(arr)
local count = 0
for k, v in pairs(arr) do
count = count + 1
end
for i = 1, count do
if arr[i] == nil then
return false
end
end
return true, count
end
dumpObj = function(obj, level)
if type(obj) ~= "table" then
return wrapVal(obj)
end
level = level + 1
local tokens = {}
tokens[#tokens + 1] = "{"
local ret, count = isArray(obj)
if ret then
for i = 1, count do
tokens[#tokens + 1] = getIndent(level) .. wrapVal(obj[i], level) .. ","
end
else
for k, v in pairs(obj) do
tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
end
end
tokens[#tokens + 1] = getIndent(level - 1) .. "}"
return table.concat(tokens, "\n")
end
return dumpObj(obj, 0)
end
测试代码:
-- test.lua
local obj = {
string1 = "Hi! My name is LiXianlin",
string2 = "aa\tbb\rcc\ndd\\ee\"ff",
string3 = "a\\tb\\rc\\n\\\\ee\"ff",
int = 9527,
float = 3.1415,
bool = true,
array = {
1, 2, 3,
{
a = 21,
b = 22,
c = 23,
},
},
table = {
x = 100,
y = 200,
w = 960,
h = 640,
},
[88] = 88888,
[9.7] = 22222,
}
print(debug.dump(obj))
输出结果:
-- test.lua
local obj = {
string1 = "Hi! My name is LiXianlin",
string2 = "aa\tbb\rcc\ndd\\ee\"ff",
string3 = "a\\tb\\rc\\n\\\\ee\"ff",
int = 9527,
float = 3.1415,
bool = true,
array = {
1, 2, 3,
{
a = 21,
b = 22,
c = 23,
},
},
table = {
x = 100,
y = 200,
w = 960,
h = 640,
},
[88] = 88888,
[9.7] = 22222,
}
print(debug.dump(obj))
函数特点:
1、理论上支持无限级table嵌套
2、格式化输出,可读性好
3、输出结果可直接用于lua代码
4、function、userdata、thread类型tostring输出
5、当字符串中含有控制字符时,可能有影响(代码中仅对\t,\r,\n等进行了处理)