无法获取数组的第一个项目

以下是由函数 getTargets(); 打印出的一个数组:

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

当我使用 players = getTargets(); 将其放入变量中并想要访问第一个变量时(无论其名称如何),我遇到了一些问题。我尝试了以下方法:

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

我想访问此数组的第一个变量,无论其值如何。 如何做到这一点?

点赞
用户7504558
用户7504558

你可以试着以这种方式获取键值/名称:

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)

但无法保证这将始终是第一个。但也许这是你的情况。

2017-06-26 09:51:50
用户2879085
用户2879085

你甚至不需要用for循环:

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

https://repl.it/JBw1/1

正如lhf指出的那样,你甚至不需要用pairs,可以直接这样做:

firstKey, firstValue = next(players)
2017-06-26 10:22:15
用户2858170
用户2858170

你的代码

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]为nil。 访问players [0] .username players [1] .username 将导致索引nil值的错误。

要获得未知键表的第一个元素,只需执行以下操作:

local key, value = next(someTable)

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

当第二个参数传入nil时,next返回一个初始索引和其关联的值。

请记住:

即使对于数字索引,枚举索引的顺序也是未指定的。

如果要确定顺序,应相应更改数据结构。 但我无法为此提供太多建议,因为我不知道其目的。

你可以像这样有一个小函数(简化):

local function addPlayerToList(playerList, playerLookUpTable, player)

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

end

阅读一些有关Lua面向对象编程的更好和更高级的想法。

2017-06-26 10:58:23