首页 > 解决方案 > 位置给定为字符串的 Lua 表访问

问题描述

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

例如,如果表格如下所示:

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

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

标签: lualua-table

解决方案


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

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"您必须添加"b4".


推荐阅读