2013-11-28 46 views
0

我剛開始爲魔獸世界編寫Lua代碼。我經常需要檢查嵌套在表中的全局變量是否已被其他作者的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') 

所有的評論幫助我度過覺得這個。謝謝。如果你看到更好的方法來實現這一點(我希望底部的例子有所幫助),請讓我知道。我試圖做一個函數,我可以傳遞一個字符串,但是當字符串包含[「Character」]時無法使模式匹配工作。

+2

你可以簡單地檢查'type(Mytable [MyfirstLvl] .Mysecondlvl)'。 – hjpotter92

+0

您可以在'_G'(或任何需要監視的表)上設置metatable,以便在您正在查找的變量設置時通知您的代碼。 –

+0

你可以簡單地檢查類型(Mytable [MyfirstLvl] .Mysecondlvl)...我希望這可以工作,但如果沒有定義任何部分,則會引發錯誤。無論如何,謝謝 – FireyMerlin

回答

0

這會對你有用嗎?

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

這總是返回false。我喜歡這個想法,並會看看我能否擴展它。謝謝。 – FireyMerlin

+0

對於我想要做的事情,我想我已經找到了解決方案。請讓我知道,如果他們是一個更容易或更有效的方式做到這一點。 ...不能添加代碼到這個評論,所以讓我嘗試別的。 – FireyMerlin