LUA - 从嵌套表中获取值

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

{
                    {
                    rpname  =       "名字",
                    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

请问有人可以帮助我吗?

点赞
用户6487283
用户6487283

如果我理解正确的话,你在第一个代码块中写的样本表格就是你在第二个代码块中称为 tableData 的东西,对吧?所以,你想要的是:

  1. 一个玩家的数组
  2. 这个数组中的每个条目都是一个表
  3. 一种获取每个玩家每个字段的方法

我们可以进行一些调整,使你的代码更具可读性,并从中纠正它。首先,我会重命名一些东西:

  • 将你的表格重命名为 players,因为它是一个玩家的数组
local players = {
   {
      rpname = "john",
      SteamID = "STEAM_0:0:1",
      giftsFound = "4",
   },
   -- [...]
}
  • 重命名你在 for 循环中的变量
  • 在 Lua 中,通常使用 _ 来为我们不打算使用的变量命名。在这种情况下,键(原来被命名为 k)不是我们要使用的东西。
  • 因为它是一个玩家列表,每个条目都是一个玩家,所以将变量 v 重命名为 player 是合理的。
  • 此外,我将 pairs() 更改为 ipairs(),这样做有很好的原因。我不会在这里覆盖它,但在这里它被最好地解释了。经验法则是:如果你的表格类似于数组,请使用 ipairs();否则,请使用 pairs()
for _, player in ipairs(players) do
   -- [...]
end
  • 对于嵌套的 for 循环,使用 kvpairs 是有意义的,所以它应该像这样:
for k, v in pairs(player) do
   print(k,v)
end

运行完整的代码会产生如下结果:

rpname  john
giftsFound      4
SteamID STEAM_0:0:1

我想这解决了你的问题。你的代码中的真正错误是你尝试访问嵌套表格字段的方式,而且在同一作用域中使用具有已经使用过的名称(kv),这在最好的情况下是误导性的。

如果你想访问表格中的特定字段,而不是遍历整个表,你可以这样做:

-- 打印每个玩家的名称
for _, player in ipairs(players) do
   local name = player.rpname
   print(name)
end

甚至可以这样:

-- 获取数组中第一个玩家的名称
local name = players[1].rpname

最后一个问题:"Lua" 不是一个缩写,你不必使用所有的大写字母。Lua 是在巴西创建的,我们在这里讲葡萄牙语。Lua 在葡萄牙语中是“月亮”的意思。

2020-01-20 06:23:46