我剛開始爲魔獸世界編寫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」]時無法使模式匹配工作。
你可以簡單地檢查'type(Mytable [MyfirstLvl] .Mysecondlvl)'。 – hjpotter92
您可以在'_G'(或任何需要監視的表)上設置metatable,以便在您正在查找的變量設置時通知您的代碼。 –
你可以簡單地檢查類型(Mytable [MyfirstLvl] .Mysecondlvl)...我希望這可以工作,但如果沒有定義任何部分,則會引發錯誤。無論如何,謝謝 – FireyMerlin