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