我有一个表,我正在尝试访问作为字符串传递的特定位置。使用字符串访问正确位置的最简单方法是什么?
示例,如果表如下所示:
a.b1 = true
a.b2.c1 = true
a.b2.c2 = false
a.b3 = true
在给定位置“ a.b2.c2”作为字符串的情况下,如何将a.b2.c2更改为true。
答案 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)