【问题标题】:Lua - iterator with variable number of argumentsLua - 具有可变数量参数的迭代器
【发布时间】:2023-03-17 20:18:01
【问题描述】:

我一直在尝试了解 Lua 迭代器的工作方式和行为方式。虽然闭包对我来说很清楚,但我在使用无状态迭代器时遇到了困难。

最简单的任务,例如重新实现 ipairs 或pairs,对我来说是相当清楚的。但是如果我想编写一个迭代器,它接收可变数量的表并遍历它们怎么办? 例如,

for i in iter({1,2,3}, {'a', 'b', 'c'}, {100, 101}, {}) do
    print(i)
end
--I would expect it to write: 1, 2, 3, a, b, c, 100, 101

我一直试图在互联网上找到一些有用的信息,但我所看到的只是一遍又一遍地研究相同的简单示例。所以,欢迎任何提示和建议!

【问题讨论】:

    标签: lua iterator iteration


    【解决方案1】:

    我认为您正在谈论的迭代器应该如下所示: 编辑:用一个包含两个索引的数组替换了 2 个索引的使用。

    function iter_variable (a, indexArr)
      indexArr[2] = indexArr[2] + 1
      local v = a[indexArr[1]][indexArr[2]]
      if v then
        return indexArr, v
      else
        -- end of current internal DS, move on to the next internal DS
        indexArr[1] = indexArr[1] + 1
        indexArr[2] = 1
        local v = a[indexArr[1]][indexArr[2]]
        if v then
            return indexArr, v
        end
      end
    end
    
    function ipairs_variable (...)
      local a = {...}
      return iter_variable, a, {1,0}
    end
    
    for i, v in ipairs_variable({1,2,3}, {'a', 'b', 'c'}, {100, 101}, {}) do
      print(v)
    end
    

    【讨论】:

    • 它似乎对我不起作用,因为 j 总是为零。这可能是因为 for 循环在 Lua 中的工作方式。迭代器将始终只使用两个参数调用 - 状态和种子,这使得使用第三个(至少我认为是这样的)索引这样的表是不可能的。
    • 根据您对状态/种子模型的评论重构建议的解决方案。
    • 我还没想过让它无籽!好主意。虽然,我建议对您的答案进行一些更改,使其成为一个实际的 Lua 程序(在 Lua 中,我们从 1 开始索引表,而不是 0)。现在它也适用于参数列表。一旦您接受编辑,我就可以接受答案。
    • @PoorBoi : 很高兴帮助好友,更高兴的是您对解决方案的微调。
    • 似乎{} 被用作强制终止符。那是 C 风格,不是 Lua 风格 :-)
    猜你喜欢
    • 2013-03-14
    • 2022-11-13
    • 2016-11-15
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2018-07-20
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多