2017-06-26 43 views
2

的第一項下面是由函數getTargets();打印數組:無法獲得陣列

{ 
    name = { 
    isPlayer = true, 
    isBlocking = false, 
    username = "yes" 
    } 
} 

當我做players = getTargets();把這個變量,並希望無論訪問第一個變量的名字,我有一些麻煩。我試過那些:

players.name.username --displays "yes" 
players[0].username --displays nil 
players[1].username --displays nil 

我想訪問此數組的第一個變量,不管它的值是什麼。 我該怎麼做?

+0

那裏沒有數組。你可以得到'players.name.username'。 – moteus

+0

@moteus但「名稱」可以改變爲別的東西。那我該怎麼稱呼它呢? –

+0

請提供更正確的示例。可以建議例如'players = {{name = {username =「yes」,}}}; print(players [1] .name.username'但是不知道你需要什麼。 – moteus

回答

1

您的代碼

local players = { 
    name = { 
    isPlayer = true, 
    isBlocking = false, 
    username = "yes" 
    } 
} 

相當於

local players = {} 
players.name = { 
    isPlayer = true, 
    isBlocking = false, 
    username = "yes" 
} 

所以沒有索引0或1,因此players[0]players[1]是零。 players[0].usernameplayers[1].username將導致索引nil值的錯誤。

要獲得未知的密鑰表的第一個元素簡單地做到這一點:

local key, value = next(someTable) 

https://www.lua.org/manual/5.3/manual.html#pdf-next

當零作爲第二個參數調用,接下來返回初始 指數及其相關價值。

記住:沒有指定

其中指數枚舉的順序,甚至 的數字指標。

如果你想確保你應該相應地改變你的數據結構。 但我不能給你很多建議,因爲我不知道這個的目的。

你可以有一點點像函數(simplyfied):

local function addPlayerToList(playerList, playerLookUpTable, player) 

    table.insert(playerList, player) 
    playerLookUpTable[player.name] = #playerList 

end 

閱讀一些有關OOP在Lua爲更好和更先進的理念。

0

您可以嘗試通過這種方式拿到鑰匙/名稱:

local players = { 
    name = { 
    isPlayer = true, 
    isBlocking = false, 
    username = "yes" 
    } 
} 


local FirstPlayer 
for k,v in pairs(players) do FirstPlayer=k break end 
print(players[FirstPlayer].username) 

但也不能保證,這將永遠是第一位。但也許這是你的情況。

0

你甚至不需要一個循環:

n,t = pairs(players) 
firstKey, firstValue = n(t) 

https://repl.it/JBw1/1

由於LHF指出的那樣,你甚至都不需要對,你可以簡單地做

firstKey, firstValue = next(players) 
+1

或簡單的'firstKey,firstValue = next(players)'。但是請注意'pairs'和'next'不能保證特定的順序遍歷,他們可能在不同的運行中給出不同的結果。 – lhf