Что такое "n" в возвращаемом значении сопрограммы?

У меня есть следующая сопрограмма и таблица, которые выглядят так:

co = coroutine.create(function(...)
  for item in pairs(table.pack(...)) do 
    coroutine.yield(item)
  end
  coroutine.yield('Evil')
  return 'NO!'
end)

values = {1, 2, 3, 4, 5, 6}

Когда я вызвал резюме, оно выдает значение, как ожидалось, и неожиданно выдает n до Evil

> coroutine.resume(co, table.unpack(values))
true    1
> coroutine.resume(co, table.unpack(values))
true    2
> coroutine.resume(co, table.unpack(values))
true    3
> coroutine.resume(co, table.unpack(values))
true    4
> coroutine.resume(co, table.unpack(values))
true    5
> coroutine.resume(co, table.unpack(values))
true    6
> coroutine.resume(co, table.unpack(values))
true    n -- Here we have n
> coroutine.resume(co, table.unpack(values))
true    Evil
> coroutine.resume(co, table.unpack(values))
true    NO!

Что значит n стоять за?

1 ответ

Решение

Начиная с Lua 5.2 (наверное), table.pack() работает как {...}, но добавляет поле 'n', в котором хранится количество элементов. Это ключ 'n', который вы получаете.

Обратите внимание, что вы перечисляете только ключи, а не сами значения.

Если вы не хотите, чтобы "н", используйте ipairs() вместо pairs(),

Другие вопросы по тегам