Lua 开发中常用的实用代码片段集合。

重写全局 print 函数,使其在输出时自动附加当前协程 ID 和源文件行号,方便在多协程环境中快速定位日志来源。

local function rpad(str, len, char)
    if char == nil then char = ' ' end
    return str .. string.rep(char, len - #str)
end
local originalPrint = print
_G.print = function(...)
    local co, _ = coroutine.running()
    local info = debug.getinfo(2, "Sl")
    local lineinfo = rpad(info.short_src .. ":" .. info.currentline, 22)
    local prefix = string.format("[%s][%s] ", tostring(co):match("thread: (.+)"), lineinfo)
    -- 使用table.concat来连接所有参数,并去除开头的空格
    local args = { ... }
    for i = 1, #args do
        args[i] = tostring(args[i])
    end
    local message = table.concat(args, " ")
    message = message:gsub("^%s+", "") -- 去除开头的空格
 
    originalPrint(prefix .. " " .. message)
end