Объясните, почему unpack() возвращает разные результаты в Lua

Следующий сценарий находит простые числа в диапазоне от 1 до 13. Когда я явно перебираю таблицу, содержащую результаты, я вижу, что сценарий работает должным образом. Однако, если я использую функцию unpack() в таблице, распечатываются только первые 3 числа.

Из документации: unpack — это "специальная функция с несколькими возвратами. Она получает массив и возвращает в качестве результата все элементы массива, начиная с индекса 1".

Почему это не работает в сценарии ниже?

t = {}
for i=1, 13 do t[i] = i end

primes = {}
for idx, n in ipairs(t) do
  local isprime = true
  for i=2, n-1 do
    if n%i == 0 then
      isprime = false
      break
    end
  end
  if isprime then
    primes[idx] = n
  end
end
print('loop printing:')
for i in pairs(primes) do
  print(i)
end
print('unpack:')
print(unpack(primes))

Выполняется

$ lua5.3 primes.lua
loop printing:
1
2
3
5
7
13
11
unpack:
1   2   3

person minerals    schedule 29.12.2015    source источник


Ответы (1)


Изменять

primes[idx] = n

to

primes[#primes+1] = n

Причина в том, что idx не является последовательным, поскольку не каждое число является простым.

person tonypdmtr    schedule 29.12.2015
comment
Важной (и отсутствующей) деталью здесь является то, что unpack работает от длины списка и длины таблицы lua не определено, если в части массива есть дыры. - person Etan Reisner; 30.12.2015
comment
В яблочко! Спасибо, что добавили это. - person tonypdmtr; 30.12.2015
comment
@EtanReisner Хороший комментарий; Просто придираюсь к части массива. Массивная часть таблицы является деталью реализации, и в стандартной реализации можно привести таблицу во внутреннее состояние, при котором часть массива не имеет дыр, а в таблице нет последовательности. - person Tom Blodget; 30.12.2015
comment
@TomBlodget Справедливое замечание. Хотя в данном случае я не имел в виду внутреннюю деталь, а просто имел в виду целочисленное пространство ключей (в отличие от нецелого пространства ключей). - person Etan Reisner; 30.12.2015
comment
Ссылки на руководства по lua 5.3 для table.unpack и оператор длины. - person Etan Reisner; 30.12.2015
comment
Также важно отметить, что unpack может быть задан явный диапазон для распаковки, поэтому он не полностью зависит от массива в списке. - person Nicol Bolas; 30.12.2015