Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua-具有可变参数数的迭代器_Lua_Iterator_Iteration - Fatal编程技术网

Lua-具有可变参数数的迭代器

Lua-具有可变参数数的迭代器,lua,iterator,iteration,Lua,Iterator,Iteration,我一直在试图理解Lua迭代器是如何工作和行为的。虽然闭包对我来说很清楚,但我在使用无状态迭代器时遇到了困难 最简单的任务,如重新实现IPAIR或PAIR,对我来说相当清楚。但是,如果我想编写一个迭代器,它接收可变数量的表并对它们进行迭代,该怎么办? 比如说, 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,

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

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

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

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

我认为您所说的迭代器应该如下所示: 编辑:将使用两个索引替换为包含两个索引的单个数组

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中的工作方式。迭代器总是用两个参数调用——state和seed,这使得不可能使用第三个参数(至少我认为是这样)对这样的表进行索引。根据您对state/seed模型的评论重构了建议的解决方案。我没有想过要使它成为无种子的!好主意。尽管如此,我还是建议对您的答案进行一些修改,使其成为一个实际的Lua程序(在Lua中,我们从1开始索引表,而不是从0开始)。现在它还可以处理参数列表。一旦你接受了编辑,我就可以接受答案了。@PoorBoi:很乐意帮助buddy,更高兴你对解决方案进行了微调。
{}
似乎被用作强制终止符。这是C风格,不是Lua风格:-)