发布于 2016-10-10 13:05:21 | 204 次阅读 | 评论: 0 | 来源: 网友投递
Lua 脚本语言
Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。
会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, 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
dumpObj = function(obj, level)
if type(obj) ~= "table" then
return wrapVal(obj)
end
level = level + 1
local tokens = {}
tokens[#tokens + 1] = "{"
for k, v in pairs(obj) do
tokens[#tokens + 1] = getIndent(level) .. wrapKey(k) .. " = " .. wrapVal(v, level) .. ","
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 = "aatbbrccndd\ee"ff",
string3 = "a\tb\rc\n\\ee"ff",
int = 9527,
float = 3.1415,
bool = true,
table = {
1, 2, 3,
{
a = 21,
b = 22,
c = 23,
},
},
[88] = 88888,
[9.7] = 22222,
}
print(debug.dump(obj)
输出结果:
{
["string1"] = "Hi! My name is LiXianlin",
[9.7] = 22222,
["table"] = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = {
["b"] = 22,
["a"] = 21,
["c"] = 23,
},
},
["float"] = 3.1415,
["int"] = 9527,
["string3"] = "a\tb\rc\n\\ee"ff",
["bool"] = true,
["string2"] = "aatbbrccndd\ee"ff",
[88] = 88888,
}
函数特点:
1、理论上支持无限级table嵌套
2、格式化输出,可读性好
3、输出结果可直接用于lua代码
4、function、userdata、thread类型tostring输出
5、当字符串中含有控制字符时,可能有影响(代码中仅对t,r,n等进行了处理)