For loop 工厂函数无法将本地迭代器返回到lua中的for循环?

For loop 工厂函数无法将本地迭代器返回到lua中的for循环?,for-loop,lua,iterator,local,lua-5.3,For Loop,Lua,Iterator,Local,Lua 5.3,为什么工厂函数不能将本地函数iter作为迭代器返回for循环 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

为什么工厂函数不能将本地函数iter作为迭代器返回for循环

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

工厂/迭代器函数已正确实现。问题是,通过使用

local function iter(to,from)
  --...
end
相当于:

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

iter是fromto无法访问的局部变量。删除local,它就会运行。

正如@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之前,但我认为如果局部变量与另一个函数在同一个chunck中声明,那么另一个函数将访问它??因此我只需要在fromto返回它之前声明函数iter。此外,函数可以使用在其作用域之外和作用域之下声明的局部变量,对吗?没有不声明的函数。问题在于变量和范围。全局变量始终在作用域中,尽管它可能被具有相同名称的其他变量隐藏。局部变量的作用域是从声明它的点开始到声明它的块结束。所以,你们的iter是一个局部变量,在11到15行的范围内。请参阅。注意:iter变量不需要在使用函数值的范围内。您正在从工厂函数返回函数值,因此该值将继续存在,并由for语句重复调用。