Доступ к таблице Lua с указанием местоположения в виде строки - PullRequest
0 голосов
/ 26 августа 2018

У меня есть таблица, и я пытаюсь получить доступ к определенному местоположению, которое передается в виде строки.Какой самый простой способ использовать строку для доступа к правильному расположению?

Пример, если таблица выглядит следующим образом:

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

Как я могу изменить a.b2.c2 на trueс указанием местоположения 'a.b2.c2' в виде строки.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Вы можете использовать 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)
0 голосов
/ 27 августа 2018

Если у вас есть только один уровень, вы можете использовать индексирование в квадратных скобках:

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".

...