Если у вас есть только один уровень, вы можете использовать индексирование в квадратных скобках:
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"
.