Latest web development tutorials

Lua итератора

Итератора (итератор) это объект, который может быть использован для обхода части контейнера стандартной библиотеки шаблонов или все элементы, адрес каждого объекта итератора представляет собой контейнер, определяемый

В Lua итератора является указатель типа структуры поддержки, которая может пройти через каждый элемент коллекции.


Дженерики для итератора

Дженерики для сохранения в своей собственной внутренней итеративной функции, на самом деле, она сохраняет три значения: итеративный функции, государственные константы, управляющие переменные.

Дженерики для итерации предоставляет набор пар ключ / значение, синтаксис выглядит следующим образом:

for k, v in pairs(t) do
    print(k, v)
end

Приведенный выше код, K, V список переменных; пара (Т) для списка выражений.

Смотрите следующие примеры:

array = {"Lua", "Tutorial"}

for key,value in ipairs(array) 
do
   print(key, value)
end

Выход выше код выполняется:

1  Lua
2  Tutorial

Приведенные выше примеры, которые мы использовали итерационные функции ipairs Lua, предоставляемые по умолчанию.

Здесь мы рассмотрим процесс для исполнения вентилятора:

  • Во-первых, инициализации, вычисляется значение после выражения, выражение должно возвращать в течение требуемого диапазона трех значений: итеративной функции, констант состояния, управляющих переменных и присвоение многозначным, количество результатов, если выражение возвращает меньше трех с точки нильполугруппы автоматически составляют, дополнительная часть будет игнорироваться.
  • Во-вторых, государственные константы и переменные управления в качестве параметра для вызова функции итератора (Примечание: для структуры, константы состояния бесполезно, просто получить его значения при инициализации и передаются функции итерации).
  • В-третьих, функция возвращает значение итерации к списку переменных.
  • В-четвертых, если возвращаемое значение ноль в первом конце цикла, в противном случае тело цикла.
  • В-пятых, призыв ко второй функции шаг итерации снова

, В Lua мы часто используем для описания функции итератора, каждый вызов этой функции возвращает следующий элемент коллекции. Lua итератора содержит следующие два типа:

  • Лица без итератора
  • Multi-состояние итератора

Лица без итератора

Stateless итератора относится не сохраняет никаких государственных итераторы, поэтому мы можем использовать цикл без гражданства итератор не создавать пробки тратить дополнительную цену.

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

Типичным примером такого простого лица без итератора ipairs, он через каждый элемент массива.

В следующем примере мы используем простую функцию для достижения итератор, цифровой п квадрат:

function square(iteratorMaxCount,currentNumber)
   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
   return currentNumber, currentNumber*currentNumber
   end
end

for i,n in square,3,0
do
   print(i,n)
end

В приведенном выше примере выход:

1	1
2	4
3	9

Итерационный состояния Обход включает в себя таблицу (во время цикла не изменяется состояние постоянной) и текущий индекс индекса (управляющие переменные), ipairs и преумножающийся функция очень проста, мы можем достичь в Lua:

function iter (a, i)
    i = i + 1
    local v = a[i]
    if v then
       return i, v
    end
end
 
function ipairs (a)
    return iter, a, 0
end

Когда Lua называет ipairs (а), чтобы начать цикл, он приобрел три значения: итеративный функцию ИТЭР, постоянное состояние, управление переменной начальное значение 0, тогда Lua называет ITER (а, 0) возвращает значение 1, а [1] (если только не [1] = ноль); второй итерации вызывает ITER (а, 1) возвращает значение 2, а [2] ...... до первого элемента равна нулю.


Multi-состояние итератора

Во многих случаях необходимость сохранения множества информации итератора состояния, а не просто указать постоянные контрольные и переменные, самый простой способ заключается в использовании замыкания, есть способ, чтобы инкапсулировать всю информацию о состоянии в таблицу, таблицу как итеративный статус констант, так как в этом случае вся информация может быть сохранена в таблице, поэтому итеративный функция, как правило, не требуется в качестве второго параметра.

В следующем примере мы создали наши собственные итераторы:

array = {"Lua", "Tutorial"}

function elementIterator (collection)
   local index = 0
   local count = #collection
   -- 闭包函数
   return function ()
      index = index + 1
      if index <= count
      then
         --  返回迭代器的当前元素
         return collection[index]
      end
   end
end

for element in elementIterator(array)
do
   print(element)
end

В приведенном выше примере выход:

Lua
Tutorial

Приведенные выше примеры мы можем видеть, использование замыканий внутри функции elementIterator, рассчитанное для достижения установленного размера и выход каждого элемента.