工厂函数无法 return 局部迭代器到 lua 中的 for 循环?

Factory function unable to return the local iterator to for loop in lua?

为什么工厂函数fromto 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

iterfromto 无权访问的局部变量。删除 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

有两点需要理解:变量作用域和函数是值。

  1. 变量是全局变量或局部变量。局部变量是词法范围的。它们在声明之后的语句到块末尾的范围内。如果名称不是局部变量的名称,它将成为全局变量引用。在您的第 2 行,iter 是一个全局变量。

  2. 函数没有声明,它们是在执行函数定义表达式时创建的值。 (函数定义语句只是函数定义表达式和变量赋值的另一种语法。)此外,函数没有名称。它们仅由一个或多个变量引用。因此,您的函数值确实存在并被 iter 变量引用,直到执行控制通过包含函数定义的行。在您的代码中,这是第 11 行的结尾。