昨晚手机进水了,早上心情非常不好,才发现手机可能是比你老婆陪伴你还久的物件,这么说或者很不人道,但如果你是一个把飞向火星作为你的终身事业的人,应该可以理解:“事或物,很多时候甚至比人承载更多的情感“
没心思工作,就来折腾一下代码吧,分享一个lua 打印的实现:
(具体什么功能也和一般打印没什么两样,很普通,就是能打印堆栈)
-- 打印lua堆栈信息
function printCallStack(lev)
local startLevel = lev or 2 --0表示getinfo本身,1表示调用getinfo的函数(printCallStack),2表示调用printCallStack的函数,可以想象一个getinfo(0级)在顶的栈.
local maxLevel = 20 --最大递归10层
local res = ""
for level = startLevel, maxLevel do
-- 打印堆栈每一层
local info = debug.getinfo(level, "nSl")
if info == nil then break end
-- 打印该层的参数与局部变量
local index = 1 --1表示第一个参数或局部变量, 依次类推
local kv = ""
while true do
local name, value = debug.getlocal(level, index)
if name == nil then break end
local valueType = type(value)
local valueStr
if valueType == 'string' then
valueStr = value
elseif valueType == "number" then
valueStr = string.format("%.3f", value)
end
if valueStr ~= nil then
kv = string.format(" %s%s=%s,", kv, name, value)
end
index = index + 1
end
local ps = info.source and string.split(info.source,"/") or nil
res = res .. "\n" .. string.format("%-20s%s_%d\t\t%s", ps and ps[#ps] or "", info.name or "" , info.currentline, kv)
end
return res
end
当然上面代码并没有完全和Unity或游戏日志系统整合,但是这是既可以获取堆栈信息,又有层级结构和递归(代码有些绕),之后是铁定能整合,这么一个代码,谁不爱
Debug.Log(printCallStack())
再再分享一个,获取可变参数的处理方法
local par_len = select("#",...)
local par_one = select(1,...)
local ss = {}
for i = 1, len do ss[i] = tostring(select(i, ...))end
local str = table.concat(ss, ",")
当然,不确定select语法是不是新语法,感觉好像目测我的项目lua 5.1 能用
当以上lua灵活运用时,也没有怎么样,还是可以继续搬砖
====================================================================
遇到过只想写lua,不想写c#的人,但他写了2年 lua, 还只会if else,不知道他为何热爱
也遇到过只想写C#,觉得lua是脚本的人,大量把C#的Enum,往lua代码里面套用,代码是能通过的,无措便是优,但更不知道他为何热爱
你是无论如何唤不醒一个装睡的人
你也是无论如何不能把一个人从他的舒适区把他赶出来