如何安全地迭代lua表而删除键
问题描述:
在我的主协程中,我根据用户操作从表中删除或添加条目。在后台,我想遍历表中的条目。我不介意,特别是如果我错过了一次迭代插入,提供我可以在下一个之前捕获它。如何安全地迭代lua表而删除键
用pairs
迭代它可以安全吗?或者我应该用next
代替?
答
您可以在遍历表时安全地删除条目,但不能创建新条目,即新键。不过,您可以修改现有条目的值。 (删除条目是该规则的特例。)
答
你不能从这里到达那里。至少不直接...
作为lhf said您可以在遍历表时修改或删除条目,但不能添加它们。结果是...未定义。 (阅读:分支进入超空间或等同于所有实际目的。)
如果你坚持能够添加条目,你将不得不克隆你的表,并使用一个副本进行迭代,另一个用于跟踪你的插入和删除。如果这本身不符合您的要求,您必须改为执行下列操作:
- 为添加表添加一个空表。
- 开始遍历主表。
- 当您找到要修改的条目时,请就地修改它们。 (这是允许的。)
- 当您找到要删除的条目时,请在原位删除它们。 (这是允许的。)
- 当您找到要添加的条目时,将它们添加到另一个空的表中。
- 当您完成迭代时,将添加表合并到主表中。
- 泡沫。冲洗。重复。
还有其他类似的模式,可以使用稍微不同的规则。例如,在步骤之间5 & 6您可能需要在合并之前为递增的表条目插入递归调用表格行代码等。您可能还需要跟踪主表和附加表中的可能删除如果这是一种可能的互动。