【问题标题】:Cannot get first item of array无法获取数组的第一项
【发布时间】:2017-11-29 02:15:01
【问题描述】:

这是一个由函数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

我想访问这个数组的第一个变量,不管它的值是什么。 我该怎么做?

【问题讨论】:

  • 没有数组。你可以得到players.name.username。
  • @moteus 但“名称”可以更改为其他名称。那我该怎么称呼它呢?
  • 请提供更正确的例子。可以建议例如players={ {name = {username = "yes",} } }; print(players[1].name.username 但不确定是不是你需要的。

标签: arrays lua


【解决方案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].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 中的 OOP 的内容,以获得更好、更高级的想法。

【讨论】:

    【解决方案2】:

    您可以尝试通过这种方式获取密钥/名称:

    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)
    

    但是不能保证这永远是第一个。但也许这就是你的情况。

    【讨论】:

      【解决方案3】:

      你甚至不需要 for 循环:

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

      https://repl.it/JBw1/1

      正如 lhf 指出的,你甚至不需要对,你可以简单地做

      firstKey, firstValue = next(players)
      

      【讨论】:

      • 或者只是firstKey, firstValue = next(players)。但请注意pairs 和next 不保证特定的遍历顺序。它们在不同的运行中可能会给出不同的结果。
      猜你喜欢
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多