Разница между итераторами с сохранением и без сохранения состояния в Lua заключается в том, что итераторы с сохранением состояния запоминают своё состояние между вызовами, а итераторы без сохранения состояния не сохраняют его между вызовами. 14
Итераторы без сохранения состояния используют только общие для управляющей переменной цикла и инвариантного состояния для вычисления значения итерации. 3 Поэтому их можно использовать в нескольких циклах, избегая затрат на создание новых замыканий. 2
Итераторы с сохранением состояния сложнее, но мощнее: каждый раз при вызове они запоминают, где остановились, и дают следующее значение. 1
Пример итератора без сохранения состояния — функция square, которая возвращает следующий номер и его квадрат, или nil, когда итерация завершена. 1 Пример итератора с сохранением состояния — функция fibonacci, которая каждый раз при вызове запоминает, где остановилась, и даёт следующее число в последовательности Фибоначчи. 1