【问题标题】:Lua Table Access with Location Given as a String位置给定为字符串的 Lua 表访问
【发布时间】:2018-08-27 13:48:44
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可以将键用作访问表的字符串,例如a[str_var],但这不考虑嵌套表

标签: lua lua-table


【解决方案1】:

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

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"

【讨论】:

    【解决方案2】:

    您可以使用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)
    

    【讨论】:

    • 运行完整的脚本语言来将密钥写入表是多余的,并且可能导致巨大的安全漏洞。除非您的 a 是全局变量,否则它也不会很好地工作。
    猜你喜欢
    • 2013-12-07
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 2023-03-16
    相关资源
    最近更新 更多