Ограничение функции unpack
Функция unpack возвращает в качестве результата все значения таблицы с целочисленными индексами в соответствующем порядке. Функция весьма удобна. Например, с ее помощью легко узнать максимальное значение элемента таблицы:
t = {100,1,200,2,300,3}
print( math.max(unpack(t)) )
Насколько безопасно пользоваться этой функцией?
Напишем тест
x ={}
for i=1,math.huge do
x[i] = i
unpack(x)
print(i,": success")
end
И запустим его в standalone интерпретаторе языка lua. Скрипт в цикле от 1 до бесконечности добавляет новый элемент в таблицу и вызывает функцию unpack. Посмотрим, какого размера таблицу сможет та функция переварить.
Что имеем? Так выглядит конец листинга:
7994 : success
7995 : success
7996 : success
7997 : success
7998 : success
7999 : success
C:\Program Files (x86)\Lua\5.1\lua.EXE: unpack.lua:4: too many results to unpack
stack traceback:
[C]: in function 'unpack'
unpack.lua:4: in main chunk
Таким образом, максимально возможный размер таблицы 7999. Таблицу из 8000 элементов функция unpack обработать уже не в состоянии. Имплементация qlua ведет себя аналогично - в ней оставлены аналогичные ограничения. При использовании функции unpack имеет смысл учитывать эту её особенность.
Update.
С выходом версии Lua 5.4 ситуация значительно улучшилась
Во первых, функция unpack теперь именуется table.unpack
А во вторых, что есть главное, ограничения в 8000 более нет. Я запустил этот тест в среде 5.4 с шагом в 1 миллион (for i=1,math.huge,10000000 do) и не получил никаких ошибок.
