Как @YuHao говорит, ваша схема может работать. Есть несколько способов переупорядочить ваш код. Вот один из них:
local function fromto(from,to)
--parameter:invariant state, control variable
local function iter(to,from)
from = from + 1
if from <= to then
return from
else
return nil
end
end
return iter,to,from-1
end
for i in fromto(1,10) do
print(i)
end
Две вещи для понимания: переменная область и функции являются значениями.
Переменные глобальны или локальны. Локальные переменные лексически ограничены. Они находятся в области действия от заявления после их объявления до конца блока. Если имя не является именем локальной переменной, оно становится ссылкой на глобальную переменную. На вашей строке 2 iter
является глобальной переменной.
Функция не объявлена, они представляют собой значение, созданное при выражение определения функции выполняются. (Операция определения функции - это просто альтернативный синтаксис выражения выражения функции и присвоения переменной.) Кроме того, функции не имеют имен. На них просто ссылаются одна или несколько переменных. Таким образом, ваше значение функции существует и получает ссылку на переменную iter
, пока управление выполнением не пройдет через строки, содержащие определение функции. В своем коде, это конец строки 11.
, поэтому мне просто нужно объявить функцию 'iter', прежде чем' fromto' вернет ее. также функция может использовать локальную переменную, объявляющую за пределами ее области действия и ниже ее области, правильно? – william880513
Никакие функции не «объявлены». Проблема связана с переменными и областью. Глобальная переменная всегда находится в области видимости, хотя она может быть скрыта другими переменными с тем же именем. Область локальной переменной находится после того, как она объявлена до конца блока, в котором она объявлена. Таким образом, ваш 'iter' - это локальная переменная, которая находится в области от вашей линии от 11 до 15. См. [Правила видимости] (http://www.lua.org/manual/5.3/manual.html#3.5). –
Примечание: переменная 'iter' не должна находиться в области, где вы используете значение функции. Вы возвращаете значение функции из вашей фабричной функции, чтобы значение, которое должно было быть вызвано, повторялось оператором for. –