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

标签 for-loop lua iterator local lua-5.3

为什么工厂函数fromto不能将本地函数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

最佳答案

正如@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. 变量可以是全局变量,也可以是局部变量。局部变量具有词法作用域。它们的范围是从声明之后的语句到 block 的末尾。如果名称不是局部变量的名称,它将成为全局变量引用。在第 2 行,iter 是一个全局变量。

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

关于for-loop - 工厂函数无法将本地迭代器返回到lua中的for循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31353292/

相关文章:

c++ - for循环中的逗号

python - 在一行中使用 for 循环制作一个新集合

python - Pandas 日期时间错误 : Cannot compare type 'Timestamp' with type 'unicode'

variables - Lua 函数选择局部变量而不是全局变量

Java - 迭代两个列表,比较然后添加到另一个列表

具有特定步骤的Javascript for循环

arrays - 如何创建一个不迭代的lua数组

java - 生成器是否不如 "real"协程?

c++ - 将 std::vector 传递给修改输入数组的函数

C++:迭代器适配器将迭代器限制在一系列迭代器中?