Пытаться понять пользовательские итераторы - PullRequest
0 голосов
/ 06 марта 2019

я пытаюсь понять итераторы, во многих примерах я создаю что-то вроде этого:

function square(iteratorMaxCount,currentNumber)

   if currentNumber<iteratorMaxCount
   then
      currentNumber = currentNumber+1
      return currentNumber, currentNumber*currentNumber
   end

end

function squares(iteratorMaxCount)
   return square,iteratorMaxCount,0 // why not return square(iteratorMAxCount,0)????
end  

for i,n in squares(3)
do 
   print(i,n)
end

Сначала я не понимаю строку, которую я комментирую, и я не нахожу простой пример того, как сделать StatefulИтератор и итератор без состояния.Кто-нибудь может мне помочь?спасибо

1 Ответ

2 голосов
/ 06 марта 2019

С Справочное руководство Lua 3.3.5 :

A для операторов типа

 for var_1, ···, var_n in explist do block end is equivalent to the code:

 do
   local f, s, var = explist
   while true do
     local var_1, ···, var_n = f(s, var)
     if var_1 == nil then break end
     var = var_1
     block
   end
 end Note the following:

explist оценивается только один раз. Его результаты - это функция итератора, состояние и начальное значение для первой переменной итератора. f, s и var - невидимые переменные.Имена здесь только для пояснительных целей.Вы можете использовать break для выхода из цикла for.Переменные цикла var_i являются локальными для цикла;вы не можете использовать их значения после for.Если вам нужны эти значения, то присвойте их другим переменным перед разрывом или выходом из цикла.

Таким образом, squares () должен вернуть функции (square) состояние (iteratorMaxCount) и начальное значение (0) Для работы с универсальным циклом for.

Прочтите справочное руководство, Программирование на Lua.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...