会php的人都知道php中的print_r/var_export函数,可以方便的用于打印数组或导出变量,lua中没有提供,实际应用中却是很多时候需要类的功能。 今天便封装了个简单函数,实现类功能,用来打印/导出table: -- dump.lua--[[dump对象@param mixed obj@return str
会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.lualocal 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))
输出结果:
{ [string1] = hi! my name is lixianlin, [9.7] = 22222, [table] = { [y] = 200, [x] = 100, [h] = 640, [w] = 960, }, [88] = 88888, [string2] = aa\tbb\rcc\ndd\\ee\ff, [int] = 9527, [string3] = a\\tb\\rc\\n\\\\ee\ff, [bool] = true, [array] = { 1, 2, 3, { [b] = 22, [a] = 21, [c] = 23, }, }, [float] = 3.1415,}
函数特点:
1、理论上支持无限级table嵌套
2、格式化输出,可读性好
3、输出结果可直接用于lua代码
4、function、userdata、thread类型tostring输出
5、当字符串中含有控制字符时,可能有影响(代码中仅对\t,\r,\n等进行了处理)