2017-06-26 34 views
2

Hier ist ein Array mit einer Funktion gedruckt getTargets();:Kann nicht erste Element des Arrays erhalten

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

Als ich players = getTargets(); tun dies in der Variablen zu setzen und seinen Namen ganz gleich erste Variable zugreifen will, ich ein paar Probleme haben. Ich habe versucht, diese:

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

Ich möchte auf die erste Variable dieses Array zugreifen, egal was ist ihr Wert. Wie kann ich das tun?

+0

dort kein Array. Sie können 'players.name.username' erhalten. – moteus

+0

@moteus aber der "Name" kann zu etwas anderem wechseln. Wie soll ich das dann nennen? –

+0

Bitte geben Sie ein genaueres Beispiel an. Kann vorschlagen, z.B. 'players = {{Name = {Benutzername =" Ja ",}}}; print (players [1] .name.username 'Aber nicht sicher, was du brauchst. – moteus

Antwort

1

Ihr Code

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

entspricht

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

So kein Index 0 oder 1 ist, daher players[0] und players[1] sind gleich Null. players[0].username und players[1].username verursachen einen Fehler beim Indexieren von Nullwerten.

Um das erste Element einer Tabelle unbekannten Schlüssel zu bekommen einfach dies zu tun:

local key, value = next(someTable) 

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

Wenn mit nil als zweiten Argumente aufgerufen wird, gibt neben einen anfänglichen Index und seine assoziierter Wert.

Beachten Sie, dass:

Die Reihenfolge, in der die Indizes aufgezählt wird nicht angegeben ist, auch für numerischen Indizes.

Wenn Sie sicherstellen möchten, sollten Sie Ihre Datenstrukturen entsprechend ändern. Aber ich kann dir hier nicht viel Rat geben, da ich den Zweck nicht kenne.

Sie könnten eine kleine Funktion wie (vereinfachter) haben:

local function addPlayerToList(playerList, playerLookUpTable, player) 

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

end 

lesen etwas über OOP in Lua für schönere und modernere Ideen.

0

Sie können versuchen, den Schlüssel/Namen auf diese Weise zu erhalten:

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) 

jedoch gibt es keine Garantie, dass dies immer der erste sein wird. Aber vielleicht ist das dein Fall.

0

Sie brauchen nicht einmal eine for-Schleife:

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

https://repl.it/JBw1/1

Wie lhf wies darauf hin, Sie haben nicht einmal Paare benötigen, können Sie einfach tun können

firstKey, firstValue = next(players) 
+1

Oder einfach' firstKey, firstValue = next (players) '. Aber beachte, dass' pairs' und 'next' keine bestimmte Reihenfolge garantieren Sie können in verschiedenen Läufen unterschiedliche Ergebnisse liefern. – lhf

Verwandte Themen