如果您只有一个级别,则可以使用方括号索引:
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"。