gpt4 book ai didi

loops - 如何在 Lua 中的二维表上创建迭代器?

转载 作者:行者123 更新时间:2023-12-04 22:33:45 24 4
gpt4 key购买 nike

我有一个由表组成的 lua 表,所以它是二维的:根 -> 子 -> 孙子。

此层次结构的任何级别都不能保证是“类数组”。第一级具有“零间隙”的整数,第二级甚至没有被整数索引(而是被表索引)。

有问题的表是库中的私有(private)结构。我想为图书馆用户提供一种解析其孙辈的方法。我不太关心它们的解析顺序,只要它们都是。

我首先想到的是使用一个接受回调的函数:

-- this scope has access to root 
function eachGrandChild(callback)
for _,child in pairs(root) do
for index,grandChild in pairs(child)
callback(index, grandChild)
end
end
end

用法:
-- no access to root, only to eachGrandChild
eachGrandChild(function(index, grandChild) print(index, grandChild) end)

这么多就明白了。

我的问题是:我能否使用 iterator 提供类似的功能?反而?

我说的是可以让我这样做的东西:
for index,grandChild in iterator() do
print(index, grandChild)
end

我一直在考虑这个问题,但我无法破解它。我见过的所有示例都使用数字在每次迭代中轻松“管理迭代器的状态”。由于我没有数字,我有点卡住了。

最佳答案

Coroutines使编写这种迭代器变得容易。协程是一个可以暂停和恢复执行的函数,在概念上类似于线程。协程可以包含深度嵌套的循环,从最内层循环产生一个值,然后在恢复时从中断处继续。当它产生时,恢复它的调用者可以接收产生的值。

在您的情况下,转换 eachGrandChild到产生孙子的生成器函数中。

function eachGrandChild(root)
for _,child in pairs(root) do
for index,grandChild in pairs(child) do
coroutine.yield(index, grandChild)
end
end
end

然后使用 coroutine.wrap创建一个函数,该函数将为您的生成器创建一个协程,并在每次调用该函数时恢复它。
function grandChildren(t)
return coroutine.wrap(function() eachGrandChild(t) end)
end

现在你有了你的迭代器:
for key, val in grandChildren(root) do
print(key, val)
end

There's a chapter on this in Programming in Lua.

关于loops - 如何在 Lua 中的二维表上创建迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13300682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com