Skip to content

Instantly share code, notes, and snippets.

@CandyMi
Last active March 4, 2025 03:39
Show Gist options
  • Save CandyMi/acc2e96339af9e9c7ea23c098ae232b3 to your computer and use it in GitHub Desktop.
Save CandyMi/acc2e96339af9e9c7ea23c098ae232b3 to your computer and use it in GitHub Desktop.
用于美化输出`Lua Table`

用法

utils.lua文件拷贝到你能引用到的位置后导入, 成功后即可在全全局使用var_dump函数.

测试

使用var_dump输出_G的内容

Luajit 输出

{
    ["tonumber"] = cfunction: builtin#17,
    ["tostring"] = cfunction: builtin#18,
    ["error"] = cfunction: builtin#19,
    ["pcall"] = cfunction: builtin#20,
    ["xpcall"] = cfunction: builtin#21,
    ["loadfile"] = cfunction: builtin#22,
    ["load"] = cfunction: builtin#23,
    ["loadstring"] = cfunction: builtin#24,
    ["dofile"] = cfunction: builtin#25,
    ["gcinfo"] = cfunction: builtin#26,
    ["collectgarbage"] = cfunction: builtin#27,
    ["newproxy"] = cfunction: builtin#28,
    ["print"] = cfunction: builtin#29,
    ["_VERSION"] = String("Lua 5.1"),
    ["coroutine"] = {
        ["running"] = cfunction: builtin#31,
        ["isyieldable"] = cfunction: builtin#32,
        ["create"] = cfunction: builtin#33,
        ["yield"] = cfunction: builtin#34,
        ["resume"] = cfunction: builtin#35,
        ["wrap"] = cfunction: builtin#37,
        ["status"] = cfunction: builtin#30,
    },
    ["var_dump"] = function: 0x7f8131687558(@lualib/utils/init.lua:131),
    ["package"] = {
        ["cpath"] = String("3rd/?.so;luaclib/?.so;"),
        ["config"] = String("/\
;\
?\
!\
-\
"),
        ["loaded"] = table: 0x7f813167c568,
        ["preload"] = {
            ["table.new"] = cfunction: 0x7f813167eb38,
            ["table.clear"] = cfunction: 0x7f813167eba0,
            ["ffi"] = cfunction: 0x7f8131682c90,
            ["string.buffer"] = cfunction: 0x7f8131680638,
            ["jit.profile"] = cfunction: 0x7f8131682a18,
            ["jit.util"] = cfunction: 0x7f8131682a80,
        },
        ["loadlib"] = cfunction: 0x7f813167da10,
        ["searchpath"] = cfunction: 0x7f813167da70,
        ["seeall"] = cfunction: 0x7f813167dad8,
        ["loaders"] = [
            [1] = cfunction: 0x7f813167dba8,
            [2] = cfunction: 0x7f813167dbe0,
            [3] = cfunction: 0x7f813167dc18,
            [4] = cfunction: 0x7f813167dc50,
        ],
        ["path"] = String("lualib/?.lua;lualib/?/init.lua;"),
    },
    ["debug"] = {
        ["upvalueid"] = cfunction: builtin#137,
        ["upvaluejoin"] = cfunction: builtin#138,
        ["debug"] = cfunction: builtin#141,
        ["getregistry"] = cfunction: builtin#127,
        ["getinfo"] = cfunction: builtin#132,
        ["getlocal"] = cfunction: builtin#133,
        ["setlocal"] = cfunction: builtin#134,
        ["getmetatable"] = cfunction: builtin#128,
        ["setmetatable"] = cfunction: builtin#129,
        ["getfenv"] = cfunction: builtin#130,
        ["setfenv"] = cfunction: builtin#131,
        ["sethook"] = cfunction: builtin#139,
        ["gethook"] = cfunction: builtin#140,
        ["traceback"] = cfunction: builtin#142,
        ["setupvalue"] = cfunction: builtin#136,
        ["getupvalue"] = cfunction: builtin#135,
    },
    ["module"] = cfunction: 0x7f813167ddd0,
    ["require"] = cfunction: 0x7f813167de30,
    ["_G"] = table: 0x7f813167ad68,
    ["arg"] = {
        [0] = String("scripts/main.lua"),
        [-1] = String("luajit"),
    },
    ["jit"] = {
        ["off"] = cfunction: builtin#144,
        ["security"] = cfunction: builtin#147,
        ["attach"] = cfunction: builtin#148,
        ["arch"] = String("x64"),
        ["os"] = String("Linux"),
        ["version"] = String("LuaJIT 2.1.0-beta3"),
        ["flush"] = cfunction: builtin#145,
        ["opt"] = {
            ["start"] = cfunction: builtin#160,
        },
        ["version_num"] = Integer(20100),
        ["status"] = cfunction: builtin#146,
        ["on"] = cfunction: builtin#143,
    },
    ["assert"] = cfunction: builtin#2,
    ["math"] = {
        ["random"] = cfunction: builtin#62,
        ["randomseed"] = cfunction: builtin#63,
        ["abs"] = cfunction: builtin#38,
        ["floor"] = cfunction: builtin#39,
        ["ceil"] = cfunction: builtin#40,
        ["sqrt"] = cfunction: builtin#41,
        ["log10"] = cfunction: builtin#42,
        ["exp"] = cfunction: builtin#43,
        ["sin"] = cfunction: builtin#44,
        ["cos"] = cfunction: builtin#45,
        ["tan"] = cfunction: builtin#46,
        ["asin"] = cfunction: builtin#47,
        ["acos"] = cfunction: builtin#48,
        ["atan"] = cfunction: builtin#49,
        ["sinh"] = cfunction: builtin#50,
        ["cosh"] = cfunction: builtin#51,
        ["tanh"] = cfunction: builtin#52,
        ["frexp"] = cfunction: builtin#53,
        ["modf"] = cfunction: builtin#54,
        ["log"] = cfunction: builtin#55,
        ["deg"] = cfunction: 0x7f8131681218,
        ["rad"] = cfunction: 0x7f81316812f8,
        ["atan2"] = cfunction: builtin#56,
        ["pow"] = cfunction: builtin#57,
        ["fmod"] = cfunction: builtin#58,
        ["ldexp"] = cfunction: builtin#59,
        ["min"] = cfunction: builtin#60,
        ["max"] = cfunction: builtin#61,
        ["pi"] = Number(3.1415926535898),
        ["huge"] = Number(inf),
    },
    ["bit"] = {
        ["bnot"] = cfunction: builtin#65,
        ["bswap"] = cfunction: builtin#66,
        ["lshift"] = cfunction: builtin#67,
        ["rshift"] = cfunction: builtin#68,
        ["arshift"] = cfunction: builtin#69,
        ["rol"] = cfunction: builtin#70,
        ["ror"] = cfunction: builtin#71,
        ["band"] = cfunction: builtin#72,
        ["bor"] = cfunction: builtin#73,
        ["bxor"] = cfunction: builtin#74,
        ["tohex"] = cfunction: builtin#75,
        ["tobit"] = cfunction: builtin#64,
    },
    ["string"] = {
        ["byte"] = cfunction: builtin#76,
        ["char"] = cfunction: builtin#77,
        ["sub"] = cfunction: builtin#78,
        ["rep"] = cfunction: builtin#79,
        ["reverse"] = cfunction: builtin#80,
        ["format"] = cfunction: builtin#89,
        ["gsub"] = cfunction: builtin#88,
        ["gmatch"] = cfunction: builtin#87,
        ["lower"] = cfunction: builtin#81,
        ["upper"] = cfunction: builtin#82,
        ["dump"] = cfunction: builtin#83,
        ["find"] = cfunction: builtin#84,
        ["match"] = cfunction: builtin#85,
        ["len"] = cfunction: 0x7f81316800a8,
    },
    ["os"] = {
        ["execute"] = cfunction: builtin#116,
        ["rename"] = cfunction: builtin#118,
        ["tmpname"] = cfunction: builtin#119,
        ["getenv"] = cfunction: builtin#120,
        ["exit"] = cfunction: builtin#121,
        ["clock"] = cfunction: builtin#122,
        ["date"] = cfunction: builtin#123,
        ["time"] = cfunction: builtin#124,
        ["remove"] = cfunction: builtin#117,
        ["setlocale"] = cfunction: builtin#126,
        ["difftime"] = cfunction: builtin#125,
    },
    ["getmetatable"] = cfunction: builtin#8,
    ["getfenv"] = cfunction: builtin#10,
    ["io"] = {
        ["output"] = cfunction: builtin#113,
        ["stdin"] = file (0x7f813186ea80),
        ["stdout"] = file (0x7f813186f760),
        ["stderr"] = file (0x7f813186f680),
        ["close"] = cfunction: builtin#108,
        ["read"] = cfunction: builtin#109,
        ["write"] = cfunction: builtin#110,
        ["flush"] = cfunction: builtin#111,
        ["lines"] = cfunction: builtin#114,
        ["type"] = cfunction: builtin#115,
        ["open"] = cfunction: builtin#105,
        ["popen"] = cfunction: builtin#106,
        ["tmpfile"] = cfunction: builtin#107,
        ["input"] = cfunction: builtin#112,
    },
    ["setmetatable"] = cfunction: builtin#9,
    ["table"] = {
        ["sort"] = cfunction: builtin#93,
        ["foreachi"] = cfunction: 0x7f813167e4f0,
        ["foreach"] = cfunction: 0x7f813167e600,
        ["getn"] = cfunction: 0x7f813167e6d8,
        ["maxn"] = cfunction: builtin#90,
        ["insert"] = cfunction: builtin#91,
        ["remove"] = cfunction: 0x7f813167e8f0,
        ["move"] = cfunction: 0x7f813167ea48,
        ["concat"] = cfunction: builtin#92,
    },
    ["setfenv"] = cfunction: builtin#11,
    ["type"] = cfunction: builtin#3,
    ["next"] = cfunction: builtin#4,
    ["pairs"] = cfunction: builtin#5,
    ["ipairs"] = cfunction: builtin#7,
    ["rawget"] = cfunction: builtin#12,
    ["rawset"] = cfunction: builtin#13,
    ["rawequal"] = cfunction: builtin#14,
    ["unpack"] = cfunction: builtin#15,
    ["select"] = cfunction: builtin#16,
}

Lua 5.4 输出

{
    ["getmetatable"] = LuaCFunction(0x5596673af980),
    ["print"] = LuaCFunction(0x5596673afca0),
    ["arg"] = {
        [-1] = String("lua"),
        [0] = String("scripts/main.lua"),
    },
    ["select"] = LuaCFunction(0x5596673b0110),
    ["os"] = {
        ["rename"] = LuaCFunction(0x5596673b0250),
        ["clock"] = LuaCFunction(0x5596673b0360),
        ["execute"] = LuaCFunction(0x5596673b5790),
        ["getenv"] = LuaCFunction(0x5596673b5a80),
        ["difftime"] = LuaCFunction(0x5596673b5cf0),
        ["exit"] = LuaCFunction(0x5596673b6020),
        ["date"] = LuaCFunction(0x5596673b62c0),
        ["time"] = LuaCFunction(0x5596673b6560),
        ["remove"] = LuaCFunction(0x5596673b6800),
        ["setlocale"] = LuaCFunction(0x5596673b6280),
        ["tmpname"] = LuaCFunction(0x5596673b6520),
    },
    ["type"] = LuaCFunction(0x5596673b67c0),
    ["setmetatable"] = LuaCFunction(0x5596673afe60),
    ["loadfile"] = LuaCFunction(0x5596673afca0),
    ["pcall"] = LuaCFunction(0x5596673af980),
    ["_G"] = table: 0x5596673a7c50,
    ["xpcall"] = LuaCFunction(0x5596673b5750),
    ["tonumber"] = LuaCFunction(0x5596673b0320),
    ["next"] = LuaCFunction(0x5596673b0210),
    ["dofile"] = LuaCFunction(0x5596673b00d0),
    ["string"] = {
        ["dump"] = LuaCFunction(0x5596673b5cf0),
        ["unpack"] = LuaCFunction(0x5596673b5a80),
        ["gmatch"] = LuaCFunction(0x5596673b5790),
        ["len"] = LuaCFunction(0x5596673b6c60),
        ["rep"] = LuaCFunction(0x5596673b6ed0),
        ["lower"] = LuaCFunction(0x5596673b71d0),
        ["upper"] = LuaCFunction(0x5596673b7440),
        ["find"] = LuaCFunction(0x5596673b76b0),
        ["format"] = LuaCFunction(0x5596673b7920),
        ["gsub"] = LuaCFunction(0x5596673b7df0),
        ["reverse"] = LuaCFunction(0x5596673b7ed0),
        ["pack"] = LuaCFunction(0x5596673b8140),
        ["byte"] = LuaCFunction(0x5596673b83b0),
        ["sub"] = LuaCFunction(0x5596673b8620),
        ["packsize"] = LuaCFunction(0x5596673b8890),
        ["char"] = LuaCFunction(0x5596673b8b30),
        ["match"] = LuaCFunction(0x5596673b8dd0),
    },
    ["package"] = {
        ["cpath"] = String("3rd/?.so;luaclib/?.so;"),
        ["loadlib"] = LuaCFunction(0x5596673b9d00),
        ["preload"] = {
        },
        ["loaded"] = table: 0x5596673a8a60,
        ["searchpath"] = LuaCFunction(0x5596673b2d10),
        ["config"] = String("/\
;\
?\
!\
-\
"),
        ["searchers"] = [
            [1] = LuaCFunction(0x5596673baad0),
            [2] = LuaCFunction(0x5596673bada0),
            [3] = LuaCFunction(0x5596673bb070),
            [4] = LuaCFunction(0x5596673bb360),
        ],
        ["path"] = String("lualib/?.lua;lualib/?/init.lua;"),
    },
    ["_VERSION"] = String("Lua 5.4"),
    ["math"] = {
        ["acos"] = LuaCFunction(0x5596673bc0a0),
        ["huge"] = Number(inf),
        ["fmod"] = LuaCFunction(0x5596673bb030),
        ["ult"] = LuaCFunction(0x5596673bb320),
        ["type"] = LuaCFunction(0x5596673bc060),
        ["modf"] = LuaCFunction(0x5596673bc420),
        ["randomseed"] = LuaCFunction(0x5596673b6800),
        ["asin"] = LuaCFunction(0x5596673b6560),
        ["cos"] = LuaCFunction(0x5596673b62c0),
        ["rad"] = LuaCFunction(0x5596673b6020),
        ["ceil"] = LuaCFunction(0x5596673b5750),
        ["random"] = LuaCFunction(0x5596673af8b0),
        ["mininteger"] = Integer(-9223372036854775808),
        ["tan"] = LuaCFunction(0x5596673afc60),
        ["floor"] = LuaCFunction(0x5596673afd70),
        ["atan2"] = LuaCFunction(0x5596673b5fe0),
        ["log10"] = LuaCFunction(0x5596673b00d0),
        ["abs"] = LuaCFunction(0x5596673b0210),
        ["max"] = LuaCFunction(0x5596673b0320),
        ["tanh"] = LuaCFunction(0x5596673b6e90),
        ["pi"] = Number(3.1415926535898),
        ["deg"] = LuaCFunction(0x5596673b6c20),
        ["maxinteger"] = Integer(9223372036854775807),
        ["cosh"] = LuaCFunction(0x5596673b5a40),
        ["frexp"] = LuaCFunction(0x5596673b5cb0),
        ["log"] = LuaCFunction(0x5596673b78e0),
        ["pow"] = LuaCFunction(0x5596673b7670),
        ["sin"] = LuaCFunction(0x5596673b7400),
        ["sqrt"] = LuaCFunction(0x5596673b7190),
        ["atan"] = LuaCFunction(0x5596673b5fe0),
        ["tointeger"] = LuaCFunction(0x5596673b8140),
        ["sinh"] = LuaCFunction(0x5596673b7ed0),
        ["ldexp"] = LuaCFunction(0x5596673b7df0),
        ["min"] = LuaCFunction(0x5596673b8d90),
        ["exp"] = LuaCFunction(0x5596673b8af0),
    },
    ["load"] = LuaCFunction(0x5596673b83b0),
    ["ipairs"] = LuaCFunction(0x5596673b8dd0),
    ["var_dump"] = LuaFunction(0x5596673af7d0@lualib/utils/init.lua:131),
    ["debug"] = {
        ["setlocal"] = LuaCFunction(0x5596673b2cd0),
        ["getmetatable"] = LuaCFunction(0x5596673bad60),
        ["getinfo"] = LuaCFunction(0x5596673b2b90),
        ["setuservalue"] = LuaCFunction(0x5596673bdaf0),
        ["gethook"] = LuaCFunction(0x5596673bdd90),
        ["getupvalue"] = LuaCFunction(0x5596673b2f70),
        ["getlocal"] = LuaCFunction(0x5596673baa60),
        ["upvalueid"] = LuaCFunction(0x5596673b6ac0),
        ["setcstacklimit"] = LuaCFunction(0x5596673b33a0),
        ["getuservalue"] = LuaCFunction(0x5596673bd140),
        ["upvaluejoin"] = LuaCFunction(0x5596673bf100),
        ["traceback"] = LuaCFunction(0x5596673bf370),
        ["sethook"] = LuaCFunction(0x5596673bf610),
        ["getregistry"] = LuaCFunction(0x5596673bf8b0),
        ["setmetatable"] = LuaCFunction(0x5596673bfb50),
        ["debug"] = LuaCFunction(0x5596673bfdf0),
        ["setupvalue"] = LuaCFunction(0x5596673bf870),
    },
    ["utf8"] = {
        ["codepoint"] = LuaCFunction(0x5596673bfb50),
        ["codes"] = LuaCFunction(0x5596673bfdf0),
        ["charpattern"] = String("[\0-\127�-�][�-�]*"),
        ["len"] = LuaCFunction(0x5596673bc0a0),
        ["char"] = LuaCFunction(0x5596673bb360),
        ["offset"] = LuaCFunction(0x5596673bb070),
    },
    ["error"] = LuaCFunction(0x5596673c0060),
    ["io"] = {
        ["stderr"] = file (0x7f24954a5680),
        ["stdout"] = file (0x7f24954a5760),
        ["input"] = LuaCFunction(0x5596673bb070),
        ["output"] = LuaCFunction(0x5596673bc420),
        ["close"] = LuaCFunction(0x5596673bfdf0),
        ["stdin"] = file (0x7f24954a4a80),
        ["open"] = LuaCFunction(0x5596673bfb10),
        ["type"] = LuaCFunction(0x5596673b6280),
        ["tmpfile"] = LuaCFunction(0x5596673b6520),
        ["read"] = LuaCFunction(0x5596673b67c0),
        ["popen"] = LuaCFunction(0x5596673b01d0),
        ["flush"] = LuaCFunction(0x5596673afc60),
        ["write"] = LuaCFunction(0x5596673af8b0),
        ["lines"] = LuaCFunction(0x5596673b5750),
    },
    ["rawequal"] = LuaCFunction(0x5596673af980),
    ["coroutine"] = {
        ["wrap"] = LuaCFunction(0x5596673b5750),
        ["close"] = LuaCFunction(0x5596673b6020),
        ["isyieldable"] = LuaCFunction(0x5596673bc420),
        ["yield"] = LuaCFunction(0x5596673bb070),
        ["resume"] = LuaCFunction(0x5596673bb360),
        ["create"] = LuaCFunction(0x5596673c0060),
        ["running"] = LuaCFunction(0x5596673b62c0),
        ["status"] = LuaCFunction(0x5596673bf8b0),
    },
    ["table"] = {
        ["insert"] = LuaCFunction(0x5596673bfdb0),
        ["remove"] = LuaCFunction(0x5596673afd70),
        ["unpack"] = LuaCFunction(0x5596673bf870),
        ["sort"] = LuaCFunction(0x5596673b6800),
        ["move"] = LuaCFunction(0x5596673b6560),
        ["pack"] = LuaCFunction(0x5596673b6020),
        ["concat"] = LuaCFunction(0x5596673b5750),
    },
    ["rawlen"] = LuaCFunction(0x5596673af8b0),
    ["collectgarbage"] = LuaCFunction(0x5596673bb030),
    ["require"] = LuaCFunction(0x5596673bc060),
    ["pairs"] = LuaCFunction(0x5596673bb320),
    ["tostring"] = LuaCFunction(0x5596673bc3e0),
    ["assert"] = LuaCFunction(0x5596673b2c40),
    ["rawset"] = LuaCFunction(0x5596673bc420),
    ["rawget"] = LuaCFunction(0x5596673adde0),
    ["warn"] = LuaCFunction(0x5596673b6520),
}
local type = type
local pairs = pairs
local print = print
local tostring = tostring
local getmetatable = getmetatable
local setmetatable = setmetatable
local mtype = math.type or function (v)
return type(v) == 'number' and
(v % 1 == 0 and 'integer' or 'float') or 'nil'
end
local debug_getinfo = debug.getinfo
local strrep = string.rep
local strfmt = string.format
local tconcat = table.concat
local tinsert = table.insert
local r = debug.getregistry()
local l, g = r._LOADED, _G
local V = tonumber(_VERSION:sub(4))
local function space(level)
return strrep(' ', level)
end
local function tokey(key)
if type(key) ~= 'string' then
return strfmt("%s", key)
end
return strfmt("%q", key)
end
local array_mt = r['Lua.Array']
local function isarray(tab)
if #tab > 0 then
return true
end
return array_mt and getmetatable(tab) == array_mt
end
---comment 格式化打印变量`tab`.
---@param tab any @指定指定变量
---@param meta boolean? @是否跟进元表
---@param level integer? @指定打印层级
local function var_dump(tab, meta, level)
if type(tab) ~= 'table' then
return strfmt("%s\n", tostring(tab))
end
local ptab = {}
-- 拆分
local M, I
if meta then
M = getmetatable(tab)
if M then
setmetatable(tab, nil)
tab.__metatable__ = M
end
end
if tab.__index == tab then
I = tab.__index
tab.__index = nil
end
local n = 0
local olevel = level
level = level + 1
for k, v in pairs(tab) do
if type(k) ~= 'number' and type(k) ~= 'string' then
k = tostring(k)
end
if type(v) == "number" then
if mtype(v) == 'float' then
tinsert(ptab, strfmt('%s[%s] = Number(%s),\n', space(level), tokey(k), v))
else
tinsert(ptab, strfmt('%s[%s] = Integer(%d),\n', space(level), tokey(k), v))
end
elseif type(v) == 'boolean' then
tinsert(ptab, strfmt('%s[%s] = Boolean(%s),\n', space(level), tokey(k), v))
elseif type(v) == 'table' then
if v == g or v == l then
tinsert(ptab, strfmt('%s[%s] = %s,\n', space(level), tokey(k), tostring(v)))
else
tinsert(ptab, strfmt('%s[%s] = %s', space(level), tokey(k), var_dump(v, meta, level)))
end
elseif type(v) == 'string' then
tinsert(ptab, strfmt('%s[%s] = String(%q),\n', space(level), tokey(k), v))
elseif type(v) == 'function' then
local info = debug_getinfo(v)
if info.linedefined > 0 then
if V > 5.3 then
tinsert(ptab, strfmt('%s[%s] = LuaFunction(%p%s),\n', space(level), tokey(k), v, info.source .. ':' .. info.linedefined))
else
tinsert(ptab, strfmt('%s[%s] = %s(%s),\n', space(level), tokey(k), v, info.source .. ':' .. info.linedefined))
end
else
if V > 5.3 then
tinsert(ptab, strfmt('%s[%s] = LuaCFunction(%p),\n', space(level), tokey(k), tostring(v)))
else
tinsert(ptab, strfmt('%s[%s] = c%s,\n', space(level), tokey(k), tostring(v)))
end
end
else
tinsert(ptab, strfmt('%s[%s] = %s,\n', space(level), tokey(k), tostring(v)))
end
n = n + 1
end
-- 还原
if meta then
if M then
setmetatable(tab, M)
tab.__metatable__ = nil
end
end
if I then
tab.__index = I
end
local left, right = "{\n", "%s}%s\n"
if n == #tab and isarray(tab) then
left, right = "[\n", "%s]%s\n"
end
return left .. tconcat(ptab) .. strfmt(right, space(olevel), olevel == 0 and "" or ",")
end
---comment Dump表结构
---@param tab any @格式化打印当前表结构
---@param meta? boolean @将元表结构也打印出来
_G.var_dump = function (tab, meta)
print(var_dump(tab, meta, 0))
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment