在LUA中将数组转换为字符串

A H*_*ler 5 arrays string lua

尝试将其转换为字符串,这 customLog2 = {}看起来真的像 Log = { {Group = ID, Pos = Numbers}, {Group = ID, Pos = Numbers} } 我尝试过的

local Data = string.format( "LogBook = %s ", customLog2 )
Run Code Online (Sandbox Code Playgroud)

但是因为 CustomLog 是一个数组而不是字符串或数字,所以我无法插入它。我正在尝试将数组转换为字符串,VariableFile:write(Data)所以如果有人可以提供帮助,那就太好了,谢谢。

所以我希望我的输出看起来像这样"local Data = string.format( "LogBook = %s ", customLog2 )",这样我就可以使用 :write 然后在我新创建的文件中它应该看起来像这样Log = { {Group = ID, Pos = Numbers}, {Group = ID, Pos = Numbers} }

所以这个函数可以正常工作,但需要做一件事。

function TableSerialization(t, i)
    local text = "{\n"
    local tab = ""
    for n = 1, i + 1 do                                                                 --controls the indent for the current text line
        tab = tab .. "\t"
    end
    for k,v in pairs(t) do
        if type(k) == "string" then
            text = text .. tab .. "['" .. k .. "'] = "
        else
            text = text .. tab .. "[" .. k .. "] = "
        end
        if type(v) == "string" then
            text = text .. "'" .. v .. "',\n"
        elseif type(v) == "number" then
            text = text .. v .. ",\n"
        elseif type(v) == "table" then
            text = text .. TableSerialization(v, i + 1)
        elseif type(v) == "boolean" then
            if v == true then
                text = text .. "true,\n"
            else
                text = text .. "false,\n"
            end
        elseif type(v) == "function" then
            text = text .. v .. ",\n"
        elseif v == nil then
            text = text .. "nil,\n"
        end
    end
    tab = ""
    for n = 1, i do                                                                     --indent for closing bracket is one less then previous text line
        tab = tab .. "\t"
    end
    if i == 0 then
        text = text .. tab .. "}\n"                                                     --the last bracket should not be followed by an comma
    else
        text = text .. tab .. "},\n"                                                    --all brackets with indent higher than 0 are followed by a comma
    end
    return text
end
Run Code Online (Sandbox Code Playgroud)

我的输入数组看起来像这样 Log = { Group = WestAPC } 现在这不起作用,因为 WestAPC 不是字符串,但如果 WestAPC 看起来像这样“WestAPC”,它就可以工作。我需要它不是字符串形式。

bri*_*ive 4

需要明确的是,customLog 是一个表 - 即键值对的关联数组。这里\xe2\x80\x99是一种迭代所有键/​​值对并将这些对连接成一个字符串的简单方法:

\n\n
s = ""\n\nt = {"a", "b", "c", 123, 456, 789} -- sample table\nt.someKey = "some value" -- just an extra key value, to show that keys can be strings too\n\nfor k, v in pairs(t) do\n    s = s .. k .. ":" .. v .. "\\n" -- concatenate key/value pairs, with a newline in-between\nend\n\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,如果某个键的值是另一个表{},那么您将需要一些额外的逻辑来递归迭代这些嵌套表。我\xe2\x80\x99 会把它留给你作为练习:)

\n\n

编辑 1:\n将表打印为字符串,显示变量值

\n\n
s = ""\nlocal ID = 123\nlocal Numbers = 456\nlocal Log = { {Group = ID, Pos = Numbers}, {Group = ID, Pos = Numbers} }\n\ns = s .. "{"\nfor k, v in next, Log do\n    s = s .. "{"\n\n    for vk, vv in next, v do\n        if next(v, vk) ~= nil then\n            s = s .. vk .. " = " .. vv .. ", "\n        else\n            s = s .. vk .. " = " .. vv  \n        end\n    end\n\n    if next(Log, k) ~= nil then\n        s = s .. "}, "\n    else\n        s = s .. "}"\n    end\n\nend\ns = s .. "}"\n\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑 2:\n将表打印为字符串,显示变量名称

\n\n
s = ""\nlocal ID = 123\nlocal Numbers = 456\nlocal Log = { {Group = ID, Pos = Numbers}, {Group = ID, Pos = Numbers} }\n\ns = s .. "{"\nfor k, v in next, Log do\n    s = s .. "{"\n\n    i = 1\n    for vk, vv in next, v do\n        name = debug.getlocal(1, i)\n        if next(v, vk) ~= nil then\n            s = s .. vk .. " = " .. name .. ", "\n        else\n            s = s .. vk .. " = " .. name\n        end\n        i = i + 1\n    end\n\n    if next(Log, k) ~= nil then\n        s = s .. "}, "\n    else\n        s = s .. "}"\n    end\n\nend\ns = s .. "}"\n\nprint(s)\n
Run Code Online (Sandbox Code Playgroud)\n