递归迭代器的词法作用域如何工作?

How does lexical scoping with recursive iterators work?

这个特定的示例函数在 Lua 中,但我认为主要概念适用于任何具有词法范围、first-class 函数和迭代器的语言。

代码说明(TL;DR -- 见代码):

下面的代码定义了一个迭代器构造函数,它只定义了一个本地值和 return 一个迭代器函数。

这个迭代器函数,当 运行 时,使用来自构造函数的本地值并将该值加 1。然后它 运行 递归地自我计算直到值达到 5,然后将其加 1值和 returns 数字 5。如果它再次为 运行,它将递归地 运行 自身直到值达到 20 或更高,然后它 returns nil,这是循环停止的信号。

然后我 运行 使用构造函数提供的迭代器的外部循环,当迭代器 return 为值 (5) 时,它将 运行 循环体。在外循环的主体中,我放置了一个内循环,它也使用构造函数提供的迭代器。

程序应该 运行 循环体一次(当外循环迭代器中的值达到 5 时)然后 运行 完整的内循环(让内循环值达到 20 ),然后 return 返回外循环并 运行 直到它完成。

    function iterConstr()
        local indexes = {0}
        function iter()
            print(indexes[1])
            indexes[1] = indexes[1] + 1
            if indexes[1] == 5 then
                indexes[1] = indexes[1] + 1
                return 5
            elseif indexes[1]>=21 then
                print("finished!")
                return nil
            else
                print("returning next one")
                return iter()
            end
        end
        return iter
    end

    for val in iterConstr() do
        for newVal in iterConstr() do

        end
        print("big switch")
    end

我没想到的行为是内循环和外循环的值似乎链接在一起。当焦点在 运行 通过内循环后 returned 到外循环时,它 运行 具有外循环 (6) 的预期下一个值,但随后不是迭代并递增到 20,它立即跳转到 21,这是内部循环结束的地方!

谁能帮忙解释一下为什么会出现这种奇怪的行为?

我认为您的问题出在第 3 行 - 您将 iter 声明为全局函数而不是本地函数,这使得它可以从任何 Lua 块访问。将该行更改为 local function iter() 可纠正此行为。因此,我认为这更多是应用词法范围的开发人员的问题,而不是词法范围本身的问题:)