首页 > 解决方案 > LUA - 从嵌套表中获取值

问题描述

我有一个表,用于存储每个玩家的姓名、ID 和另一个值

{
                    {
                    rpname  =       "name",
                    SteamID =       "STEAM_0:0:",
                    giftsFound      =       "1",
                            },

该表正在通过 net.ReadTable() 从服务器发送到客户端

我希望能够单独选择每个值,但是当我尝试以下操作时,它只返回每个值的第一个字母而不是第一个值

for k, v in pairs(tableData) do
        for k, v in pairs(v) do
             print(v[1]
        end
end

请问有人可以帮我吗?

标签: lualua-table

解决方案


如果我理解正确,您在第一个代码块中编写的示例表将是您tableData在第二个代码块中所称的,对吧?所以,你想要的是:

  1. 选手阵容
  2. 此数组中的每个条目都是一个表
  3. 一种获取每个玩家的每个领域的方法

通过一些调整,我们可以使您的代码更具可读性,并据此纠正它。首先,我会重命名一些东西:

  • 重命名你的桌子players,因为它是一组玩家
local players = {
   {
      rpname = "john",
      SteamID = "STEAM_0:0:1",
      giftsFound = "4",
   },
   -- [...]
}
  • 在 for 循环中重命名变量
  • 在 Lua 中,常用的做法是_命名我们不会使用的变量。在这种情况下,k我们不会使用密钥(最初名为 )。
  • 由于它是一个玩家列表,每个条目都是一个玩家,因此将变量重命名为 是合乎逻辑vplayer
  • 另外,我改成pairs()这样ipairs()是有充分理由的。我不会在这里介绍它,但在这里尽可能地解释它。经验法则:如果您的表是类似数组的,请使用ipairs(); 否则,使用pairs().
for _, player in ipairs(players) do
   -- [...]
end
  • k对于嵌套的 for 循环,使用,v和确实有意义pairs,所以它会是这样的:
for k, v in pairs(player) do
   print(k,v)
end

运行完整的部分会产生这样的结果:

rpname  john
giftsFound      4
SteamID STEAM_0:0:1

我想它可以解决你的问题。代码中的真正错误是您尝试访问嵌套表字段的方式,并且可以说,使用您已经在同一范围内使用过的名称(kv)命名变量,这在最好的情况下会产生误导。

如果您想访问表中的特定字段,而不是遍历整个内容,您可以执行以下操作:

-- To print every player's name
for _, player in ipairs(players) do
   local name = player.rpname
   print(name)
end

甚至:

-- To get the first player's (in the array) name
local name = players[1].rpname

最后一件事:“Lua”不是首字母缩写词,您不需要全部使用大写字母。Lua 是在巴西创建的,在这里我们说葡萄牙语。Lua在葡萄牙语中是月亮的意思。


推荐阅读