2015-07-11 4 views
2

Почему не функция завод fromto вернуть локальную функцию iter как итератор для цикла?Функция Factory не может вернуть локальный итератор для цикла в lua?

function fromto(from,to) 
    return iter,to,from-1 
end 

local function iter(to,from)--parameter:invariant state, control variable 
    from = from + 1 
    if from <= to then 
     return from 
    else 
     return nil 
    end 
end 

for i in fromto(1,10) do 
    print(i) 
end 

ответ

2

Как @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 

Две вещи для понимания: переменная область и функции являются значениями.

  1. Переменные глобальны или локальны. Локальные переменные лексически ограничены. Они находятся в области действия от заявления после их объявления до конца блока. Если имя не является именем локальной переменной, оно становится ссылкой на глобальную переменную. На вашей строке 2 iter является глобальной переменной.

  2. Функция не объявлена, они представляют собой значение, созданное при выражение определения функции выполняются. (Операция определения функции - это просто альтернативный синтаксис выражения выражения функции и присвоения переменной.) Кроме того, функции не имеют имен. На них просто ссылаются одна или несколько переменных. Таким образом, ваше значение функции существует и получает ссылку на переменную iter, пока управление выполнением не пройдет через строки, содержащие определение функции. В своем коде, это конец строки 11.

+0

, поэтому мне просто нужно объявить функцию 'iter', прежде чем' fromto' вернет ее. также функция может использовать локальную переменную, объявляющую за пределами ее области действия и ниже ее области, правильно? – william880513

+0

Никакие функции не «объявлены». Проблема связана с переменными и областью. Глобальная переменная всегда находится в области видимости, хотя она может быть скрыта другими переменными с тем же именем. Область локальной переменной находится после того, как она объявлена ​​до конца блока, в котором она объявлена. Таким образом, ваш 'iter' - это локальная переменная, которая находится в области от вашей линии от 11 до 15. См. [Правила видимости] (http://www.lua.org/manual/5.3/manual.html#3.5). –

+0

Примечание: переменная 'iter' не должна находиться в области, где вы используете значение функции. Вы возвращаете значение функции из вашей фабричной функции, чтобы значение, которое должно было быть вызвано, повторялось оператором for. –

2

Функция фабрики/итератора выполнена правильно. Проблема заключается в том, с помощью

local function iter(to,from) 
    --... 
end 

эквивалентно:

local iter = function(to,from) 
    --... 
end 

iter локальная переменная, которая fromto не имеет доступа. Удалите local, и он запустится.

+2

может также положить '' iter' до того fromto' в файле – ryanpattison

+0

, но я думал, что если локальная переменная объявить в том же chunck, как и другие функции, то другая функция будет иметь доступ к ней ?? – william880513

 Смежные вопросы

  • Нет связанных вопросов^_^