以字符串形式给出位置的Lua表访问

时间:2018-08-26 15:46:40

标签: lua lua-table

我有一个表,我正在尝试访问作为字符串传递的特定位置。使用字符串访问正确位置的最简单方法是什么?

示例,如果表如下所示:

a.b1 = true
a.b2.c1 = true
a.b2.c2 = false
a.b3 = true

在给定位置“ a.b2.c2”作为字符串的情况下,如何将a.b2.c2更改为true。

2 个答案:

答案 0 :(得分:0)

如果只有一个级别,则可以使用方括号索引:

[]

如果有多个,则需要对该索引进行几次迭代。您可以使用循环来做到这一点:

function setSingle(obj, key, value)
    obj[key] = value
end
setSingle(a, "b1", "foo")
print(a.b1) --> foo

您可以使用function setMultiple(obj, keys, value) for i = 1, #keys - 1 do obj = obj[keys[i]] end -- Merely "obj = value" would affect only this local variable -- (as above in the loop), rather than modify the table. -- So the last index has to be done separately from the loop: obj[keys[#keys]] = value end setMultiple(a, {"b2", "c1"}, "foo") print(a.b2.c1) --> foo 来解析格式正确的键列表。 string.gmatch将匹配由非句点符号组成的“单词”:

[^.]+

将所有内容放在一起

function parseDots(str)
    local keys = {}
    for key in str:gmatch "[^.]+" do
        table.insert(keys, key)
    end
    return keys
end

您可能会遇到的一个问题是,无法使用此功能创建新表;您必须先创建包含表,然后才能在其中创建任何键。例如,在setMultiple(a, parseDots("b2.c2"), "foo") print(a.b2.c2) --> foo 之前,您必须添加"b4.c3"

答案 1 :(得分:-1)

您可以使用loadstring来构建要作为字符串执行的语句。

a = { b2 = {} }

a.b1 = true
a.b2.c1 = true
a.b2.c2 = false
a.b3 = true

str = "a.b2.c2"
loadstring(str .. " = true")()
print(a.b2.c2)