【发布时间】:2015-02-24 18:48:00
【问题描述】:
我有一个漂亮的小 Lua 表解析器,它打印出漂亮的 lua 代码,我喜欢它……它工作得很好。有一个小问题...如果我要打印一个包含任何整数键的表或数组,它会使用pairs 循环遍历它(讽刺的是这不会弄乱代码),但我宁愿它使用@987654322 @ 如果可能的话。所以我想知道是否可以检查一个表(无需实际查看它)是否可以先使用 ipairs 循环遍历它,否则使用对。那么有没有办法从 0 而不是 Lua 默认的 1 开始循环呢?
Lua 表解析器(在 google 上找到的基本代码,对其进行了更改以使其打印对数组更友好)...
function TableParser(name, object, tabs)
local function serializeKeyForTable(k)
if type(k)=="number" then
return ""
end
if string.find(k,"[^A-z_-]") then
return k
end
return k
end
local function serializeKey(k)
if type(k)=="number" then
if k == 0 then
return "\t[" .. k .."] = "
else
return "\t"
end
end
if string.find(k,"[^A-z_-]") then
return "\t" .. k .. " = "
end
return "\t" .. k .. " = "
end
if not tabs then tabs = "" end
local function serialize(name, object, tabs) -- = {
local output = tabs .. (name ~= "" and name .. " = " or "") .. "{" .. "\n"
for k,v in pairs(object) do
if type(v) == "number" then
output = output .. tabs .. serializeKey(k) .. v
elseif type(v) == "string" then
output = output .. tabs .. serializeKey(k) .. string.format("%q",v)
elseif type(v) == "table" then
output = output .. serialize(serializeKeyForTable(k), v, tabs.."\t")
elseif type(v) == "boolean" then
output = output .. tabs .. serializeKey(k) .. tostring(v)
else
output = output .. tabs .. serializeKey(k) .. "\"" .. tostring(v) .. "\""
end
if next(object,k) then
output = output .. ",\n"
end
end
return output .. "\n" .. tabs .. "}"
end
return serialize(name, object, tabs)
end
【问题讨论】:
-
它不是“解析器”。恰恰相反:它是一个序列化程序(或者,更准确地说,是一个“漂亮的打印机”,b/c 它关心美学)。
-
if string.find(k, ..似乎完全没有意义。无论条件结果如何,您在两种情况下都返回相同的结果。
标签: parsing lua integer lua-table