Я только начинаю писать код Lua для World of Warcraft. Мне часто нужно проверить, была ли указана глобальная переменная, вложенная в таблицу, с помощью кода Lua другого автора.
Пример:Функция типа Lua для ссылки на вложенные таблицы
Mytable[MyfirstLvl].Mysecondlvl.fred
где переменная MyfirstLvl1
содержит пробелы
В настоящее время я использую:
if (type(Mytable) == 'table') and (type(Mytable[MyfirstLvl]) == 'table') and (type(Mytable[MyfirstLvl].Mysecondlvl) == 'table') then
--some code using Mytable[MyfirstLvl].Mysecondlvl.fred
end
Я хотел бы простой способ сделать это. Я думал о написании функции, которая использует _G
, но не может найти примеров разбора имен динамических переменных, в которых есть '['
и ']'
.
Есть ли простой способ определить, определено ли значение, вложенное в таблицу несколько уровней в таблице, или кто-то может помочь с созданием пользовательской функции для этого?
Вот что я придумал:
function newType(reference)
if type(reference) ~= 'string' then
print('...argument to Type must be a string')
return
end
local t = {string.split('].[', reference)}
local tt = {}
for k, v in ipairs(t) do
if string.len(v) ~= 0 then
local valueToInsert = v
if (string.sub(v, 1, 1) == '"') or (string.sub(v, 1, 1) == "'") then
valueToInsert = string.sub(v, 2, -2)
elseif tonumber(v) then
valueToInsert = tonumber(v)
end
table.insert(tt, valueToInsert)
end
end
local myReference = _G
local myType
for i, curArg in ipairs(tt) do
if type(myReference) ~= 'table' then
return 'nil'
end
if type(myReference[curArg]) ~= 'nil' then
myReference = myReference[curArg]
myType = type(myReference)
else
return 'nil'
end
end
return myType
end
SavedDB = {}
SavedDB.profiles = {}
SavedDB.profiles.Character = {}
SavedDB.profiles.Character.name = 'fireymerlin'
print(newType('SavedDB.profiles["Character"].name')
Все ваши комментарии помогли мне обдумать. Спасибо. Если вы видите лучший способ добиться этого (надеюсь, пример внизу помогает), пожалуйста, дайте мне знать. Я пытался создать функцию, в которой я мог бы передать одну строку, но не смог получить соответствие шаблону, когда строка включала [«Символ»].
Вы можете просто проверить тип '(Mytable [MyfirstLvl] .Mysecondlvl)'. – hjpotter92
Вы можете установить метатет на '_G' (или любую другую таблицу, которую вы должны отслеживать), чтобы уведомить ваш код, когда задана переменная, которую вы ищете. –
Вы можете просто проверить тип (Mytable [MyfirstLvl] .Mysecondlvl) ... Я бы хотел, чтобы это сработало, но оно выдает ошибку, если какая-либо часть не определена. Спасибо в любом случае – FireyMerlin