Ключ не хранится в таблице lua во время цикла for - PullRequest
2 голосов
/ 02 ноября 2019

Я изо всех сил пытаюсь понять это поведение в Lua. Если я выполню в локальной консоли:

tab={}
tab[100] = "E"

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

{
  [100] = "E"
}

Теперь я заполняю свою таблицу в цикле for с несколькими условиями:

cell_types = {}    
cell = 1    
for y=1, 1000 do
    for x=1, 1000 do
      if some_condition then
        cell_types[cell] = "E"
      elseif some_condition then
        cell_types[cell] = "M"
      else
        cell_types[cell] = "C"
      end
    cell = cell+1
    end
  end

Теперь, однако, таблица выглядит так:

{ "E", "E", "M", "E", "C", "C", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E", "E" }

Если я удаляю первый вызов таблицы (cell_types [cell] = "E"), то снова у меня есть пары ключ / значение:

{
  [101] = "M",
  [102] = "M",
  [103] = "M",
  [104] = "M",
  [105] = "M",
  [106] = "M",
  [107] = "M"
}

Что может вызвать такое поведение? И как мне всегда сохранять пары ключ / значение в моей таблице?

Спасибо.

1 Ответ

3 голосов
/ 02 ноября 2019

Таблица Lua всегда представляет собой набор пар ключ-значение.

Она просто внутренне оптимизирована для хранения непрерывной последовательности в виде массива и прерывистых значений в виде хэш-карты.

Byудаляя некоторые назначения, например cell_types[cell] = "E" case, вы вводите дыры в последовательность, так что она больше не попадает в часть реализации массива и должна быть повторена как хэш-карта с pairs(). Обратите внимание, что ipairs() будет выполнять итерацию только части массива таблицы и остановится в некоторой неопределенной точке, где будет найдено отверстие в последовательности.

...