2013-11-28 3 views
0

Я только начинаю писать код 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') 

Все ваши комментарии помогли мне обдумать. Спасибо. Если вы видите лучший способ добиться этого (надеюсь, пример внизу помогает), пожалуйста, дайте мне знать. Я пытался создать функцию, в которой я мог бы передать одну строку, но не смог получить соответствие шаблону, когда строка включала [«Символ»].

+2

Вы можете просто проверить тип '(Mytable [MyfirstLvl] .Mysecondlvl)'. – hjpotter92

+0

Вы можете установить метатет на '_G' (или любую другую таблицу, которую вы должны отслеживать), чтобы уведомить ваш код, когда задана переменная, которую вы ищете. –

+0

Вы можете просто проверить тип (Mytable [MyfirstLvl] .Mysecondlvl) ... Я бы хотел, чтобы это сработало, но оно выдает ошибку, если какая-либо часть не определена. Спасибо в любом случае – FireyMerlin

ответ

0

Будет ли это работать на вас?

if type(((Mytable or {})[MyfirstLvl] or {}).Mysecondlvl) == "table" 
+0

Это всегда возвращает false. Мне нравится эта идея и я увижу, могу ли я расширить ее. Благодарю. – FireyMerlin

+0

Для чего я хочу сделать, я думаю, что нашел решение. Пожалуйста, дайте мне знать, если это более простой или эффективный способ сделать это. ... Не могу добавить код в этот комментарий, поэтому позвольте мне попробовать что-то еще. – FireyMerlin

Смежные вопросы