LUA - получение значений из вложенной таблицы - PullRequest
0 голосов
/ 18 января 2020

У меня есть таблица, которая будет использоваться для хранения имени, идентификатора и другого значения каждого игрока

{
                    {
                    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

Пожалуйста, кто-нибудь может мне помочь

1 Ответ

0 голосов
/ 20 января 2020

Если я правильно понял, пример таблицы, которую вы написали в первом блоке кода, был бы тем, что вы назвали tableData во втором, верно? Итак, что вы хотите иметь:

  1. массив игроков
  2. Каждая запись в этом массиве представляет собой таблицу
  3. Способ получения каждого поля каждого player

С помощью нескольких настроек мы можем сделать ваш код более читабельным и, следовательно, исправить его. Во-первых, я бы переименовал некоторые вещи:

  • Переименуйте вашу таблицу players, поскольку это массив игроков
local players = {
   {
      rpname = "john",
      SteamID = "STEAM_0:0:1",
      giftsFound = "4",
   },
   -- [...]
}
  • Переименуйте ваши переменные в for-l oop
  • В Lua обычной практикой является использование _ для именования переменной, которую мы не собираемся использовать. В этом случае ключ (первоначально названный k) не будет использоваться нами.
  • Поскольку это список игроков, каждая запись является игроком, поэтому логично переименовать переменную v на player.
  • Кроме того, я изменил pairs() на ipairs(), и для этого есть веская причина. Я не буду освещать это здесь, но здесь объясняется как можно лучше. Практическое правило: если ваша таблица похожа на массив, используйте ipairs(); иначе используйте pairs().
for _, player in ipairs(players) do
   -- [...]
end
  • Для вложенного for-l oop имеет смысл использовать k, v и pairs, поэтому это будет что-то вроде этого:
for k, v in pairs(player) do
   print(k,v)
end

Запуск полной части приведет к следующему:

rpname  john
giftsFound      4
SteamID STEAM_0:0:1

Я полагаю, это решит вашу проблему. Настоящие ошибки в вашем коде заключались в том, что вы пытались получить доступ к полю вложенной таблицы и, возможно, именовали переменные с именами, которые вы уже использовали (k и v) в той же области, что в лучшем случае вводит в заблуждение.

Если вы хотите получить доступ к указанному полю c в таблице, вместо того, чтобы просматривать все это, вы можете сделать:

-- 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 означает Луна на португальском языке.

...