Возможно ли иметь функцию, которая может обращаться к произвольно вложенным записям таблицы? Следующий пример предназначен только для одной таблицы. Но в моем реальном приложении мне нужна функция для проверки нескольких разных таблиц на заданный (вложенный) индекс.
local table1 = {
value1 = "test1",
subtable1 = {
subvalue1 = "subvalue1",
},
}
local function myAccess(index)
return table1[index]
end
-- This is fine:
print (myAccess("value1"))
-- But how do I access subtable1.subvalue1?
print (myAccess("subtable1.subvalue1???"))
Вы не сможете сделать это с помощью строки, если только не воспользуетесь load
для обработки ее как кода Lua или не создадите функцию для перемещения по столу.
Вы можете создать функцию, которая разделит вашу строку на .
, чтобы получить каждый ключ, а затем пойдет по одному.
Вы можете сделать это, используя gmatch + один локальный над gmatch с текущей таблицей.
@Линус, хорошо, если ты можешь сделать это в сценарии, просто сделай table1.subtable1.subvalue1
, если он никогда не изменится. один за другим выполняется gmatch, потому что он будет вызываться для каждого ключа. for key in string.gmatch(index, "[^.]+") do print(key) end
Моя функция должна проверять, существует ли table1.subtable1.subvalue1, и если нет, она должна возвращать table2.subtable1.subvalue1. Поэтому я должен сказать своей функции, что она должна проверять subtable1.subvalue1.
сделайте локальный перед gmatch для table1, используйте ключи gmatch и перейдите к следующей таблице. проверить, если это ноль.
Я опубликовал другой ответ. Это то, что вы предлагали?
@Linus Да, ты понял, ты помечаешь мой ответ как «Принятый»
@Spar: Это то, что вы предлагали? Все равно работает, так что спасибо!
local table1 = {
value1 = "test1",
subtable1 = {
subvalue1 = "subvalue1",
},
}
local function myAccess(index)
local returnValue = table1
for key in string.gmatch(index, "[^.]+") do
if returnValue[key] then
returnValue = returnValue[key]
else
return nil
end
end
return returnValue
end
-- This is fine:
print (myAccess("value1"))
-- So is this:
print (myAccess("subtable1.subvalue1"))
Аргумент не обязательно должен быть строкой, если есть другой способ? Как работает "один за другим"?