如何在删除密钥时安全地迭代lua表

Eri*_*ric 8 iteration lua volatile lua-table

在我的主协程中,我根据用户操作从表中删除或添加条目.在后台,我想迭代表中的条目.我不介意特别是如果我错过了一次迭代的插入,只要我能在下一次迭代之前捕获它.

迭代它是否安全pairs?或者我应该使用next

lhf*_*lhf 5

您可以在遍历表时安全地删除条目,但无法创建新条目,即新密钥.但是,您可以修改现有条目的值.(删除条目是该规则的特例.)


JUS*_*ION 5

您不能从这里到达那里。至少不是直接...。

正如lhf所说,您可以在遍历表时修改或删除条目,但不能添加它们。结果是...未定义。(阅读:出于所有实际目的,请进入超空间或等效空间。)

如果您坚持要能够添加条目,则必须克隆表,并使用一个副本进行迭代,使用另一个副本来跟踪插入和删除操作。如果这本身不符合您的要求,则必须改为执行以下操作:

  1. 为表添加一个空表。
  2. 开始遍历您的主表。
  3. 当您找到要修改的条目时,就地对其进行修改。(允许)
  4. 找到要删除的条目后,就地删除它们。(允许)
  5. 找到要添加的条目时,请将其添加到以空开头的另一个表中。
  6. 完成迭代后,将加法表合并到主表中。
  7. 泡沫。冲洗。重复。

您还可以使用其他类似的模式,但使用的规则略有不同。例如,在第5步和第6步之间,您可能希望在合并之前为添加的表条目插入对表步行代码的递归调用,等等。您可能还必须跟踪主表和添加表中可能的删除操作如果可能的话。