Lua table.insert - странное поведение при вставке в таблицу - PullRequest
1 голос
/ 27 апреля 2020

Мне трудно понять, почему мой код ведет себя так, как он есть. У меня есть таблица с именем игроков, структурированная как ключ, пары значений. Значения также являются вложенными таблицами (элементами). Каждый элемент должен содержать хотя бы один уникальный идентификатор с именем «id», содержащийся во вложенной таблице (имя ключа) «specs».

players = {

  ['identifier_one'] = {
    {
      ["label"] = "Flashlight",
      ["weight"] = 1,
      ["name"] = "WEAPON_FLASHLIGHT",
      ["specs"] =  {
        ["pockets"] = false,
        ["id"] = "ZT345", --This is our unique identifier
        ["equip"] = true,
        ["stack"] = 1,
        ["craft"] = true
      }
    },
    {
      ["label"] = "Flashlight",
      ["weight"] = 1,
      ["name"] = "WEAPON_FLASHLIGHT",
      ["specs"] =  {
        ["pockets"] = false,
        ["id"] = "ACF124",
        ["equip"] = true,
        ["stack"] = 1,
        ["craft"] = true
      }
    }
  },

  ['another_item'] = {
    ...
  },
}

Я правильно записал структуру данных. Однако, когда я вставляю новый вложенный элемент, он добавляет новый элемент к следующему приращению в таблице, как и ожидалось, и в то же время перезаписывает все предыдущие индексы. Таким образом, предыдущие элементы ['spe c'] ['id'] становятся идентификатором newItem, если это имеет смысл? Итак, если посмотреть на макет выше, предыдущий идентификатор «ZT345» станет «ACF124». Таким образом, делая два предмета идентичными.

Когда я распечатываю, из чего состоит newItem, все идеально и должно записываться в таблицу, как задумано. Сначала я подумал, что это может быть связано с кодированием таблицы в json при записи в базу данных. Однако, если я распечатываю таблицу Players [identifier], после вставки newItem она перезаписывает все предыдущие индексы. Поэтому я почти уверен, что проблема заключается в добавлении newItem в мои плееры [идентификатор]

Мой код выглядит следующим образом:

ESX.RegisterServerCallback('zombie-inventory:itemCheck', function(source, cb, item)

  --check our item is allowed to be added.
  if items[item] then

    local src = source
    local identifier = getIdentifier(src)
    local newItem = items[item]

    if string.match(item, 'WEAPON') then
      newItem['specs'][1].id = genId(players[identifier])
    end

    --This point is where the code falls apart.
    table.insert(players[identifier], newItem)

    MySQL.Async.execute('UPDATE `user_inventory` SET `inventory` = @inventory WHERE `identifier` = @identifier', {
      ['@identifier'] = identifier,
      ['@inventory'] = json.encode(players[identifier])
    })

    cb(true)
  else
    print(('[inventory] [^3WARNING^7] invalid item for itemCheck cb: %s'):format(item))
  end
end)

Просто добавьте, функция genId () 100% возвращая уникальный идентификатор, я напечатал идентификатор много раз, и он всегда отличается.

...