2013-12-03 2 views
1

ANSWER: использовать только таблицу. * Функции для последовательностей (массивы/список) (таблицы с целыми целыми целыми числами начиная с 1). Их поведение не определено в таблице, не связанной с массивом: они могут работать или не работать так, как вы могли ожидать.table.insert переопределить существующий индекс


В Lua 5.1 table.insert (т, индекс, значение) должен двигаться вверх, если значения индекса уже существует в таблице, не так ли?

Но это не всегда так делают:

local t = {} 
table.insert(t, 4, 5) 
table.insert(t, 5, 6) 
table.insert(t, 4, 4) -- this erase the value 5 at key 4 
-- t[4] = 4, t[5] = 6, t[6] = nil 

local t = {} 
table.insert(t, 1) 
table.insert(t, 2) 
table.insert(t, 3) 

table.insert(t, 6, 7) 
table.insert(t, 6, 6) -- this erase the value 7 at key 6 
-- t[6] = 6, t[7] = nil 

Но:

local t = {} 
table.insert(t, 1) -- these two lines were added 
table.insert(t, 2) 
table.insert(t, 4, 5) 
table.insert(t, 5, 6) 
table.insert(t, 4, 4) -- now it moves the values up 
-- t[4] = 4, t[5] = 5, t[6] = 5 

local t = {} 
table.insert(t, 1) 
table.insert(t, 2) 
table.insert(t, 3) 
table.insert(t, 4) -- this line was added 
table.insert(t, 6, 7) 
table.insert(t, 6, 6) -- now it moves the values up 
-- t[6] = 6, t[7] = 7 

Это работает, как, что в командной строке LuaForWindows, а также приложение, которое запускается Lua скрипты (CraftStudio), как используя Lua 5.1.

Похоже, что это происходит, когда

  • (число записей) < индекса (для первого примера)
  • (число записей) < индекс-1 (для второго примера)

Итак, это ожидаемое поведение, ошибка Lua 5.1? Есть ли еще одна формула для прогнозирования, если это произойдет или нет?

Большое спасибо

+7

table.insert (и действительно все функции таблицы. *) Определены только для работы над таблицами, подобными массивам, без отверстий. Их поведение, когда таблица содержит отверстия, не гарантируется. –

ответ

4

таблица представляет собой список, только если его индексы являются последовательными: т [1], т [2], т [3], ... т [я], ... т [N] не равны нулю для всех i от 1 до N. Ваш код использует таблицу как ассоциативный массив (карта в C++, словарь на Python), поэтому операции таблицы не будут работать (на самом деле они могут работать иногда , так как это неопределенное поведение). Из справочника Lua 5.1:

Большинство функций в библиотеке таблиц предполагают, что таблица представляет массив или список.

К сожалению, руководство исх не явно определить «массив или список», но просмотр реф человека, где он обсуждает массивы означает, что два простых правила достаточно, чтобы быть «регулярным» или «обычный» массив: нет ноль значения для t [i] для i = 1 до N.

Возможно, вам лучше создать таблицу с t [i] = 0 для i = 1 до N, где N больше, чем вы ожидаете в вызове этой функции (например, наибольшее значение в некоторой другой таблице). После того, как вы закончите свои вставки, вы можете установить все оставшиеся t [i], которые = 0, равны нулю, но только делать это, если вам не понадобятся таблицы op.

Другое, что вы могли бы сделать, это то, что если вы обнаружите, что элемент должен быть вставлен перед i, проверьте, нет ли t [i-1]; если это так, установите значение 0 или -1 или какое-либо значение, которое представляет «фиктивный». Повторите эту проверку для i-2 и т. Д.

+3

В руководстве Lua 5.2 прямо говорится о * последовательностях *: http://www.lua.org/manual/5.2/manual.html#6.5. – lhf

+0

@lhf отлично! спасибо за указание – Schollii

Смежные вопросы