Как безопасно перебрать таблицу lua во время удаления ключей - PullRequest
7 голосов
/ 29 мая 2011

В моей главной сопрограмме я удаляю или добавляю записи из таблицы в зависимости от операций пользователя. На заднем плане я бы хотел перебрать записи в таблице. Особенно я не против, если пропущу вставку на одной итерации, при условии, что смогу ее перехватить до следующей.

Безопасно ли перебирать его с pairs? Или я должен использовать next вместо?

Ответы [ 2 ]

5 голосов
/ 29 мая 2011

Вы можете безопасно удалять записи при обходе таблицы, но не можете создавать новые записи, то есть новые ключи.Вы можете изменить значения существующих записей, хотя.(Удаление записи является частным случаем этого правила.)

4 голосов
/ 29 мая 2011

Вы не можете добраться отсюда. По крайней мере, не напрямую ....

Как сказал lhf , вы можете изменять или удалять записи при обходе таблицы, но не можете их добавлять. Результаты ... не определены. (Читайте: переход в гиперпространство или эквивалент для всех практических целей.)

Если вы настаиваете на возможности добавления записей, вам придется клонировать таблицу и использовать одну копию для итерации, а другую - для отслеживания ваших вставок и удалений. Если это само по себе не соответствует вашим требованиям, вам придется сделать что-то вроде этого:

  1. Создать пустую таблицу для добавления таблиц.
  2. Начните итерацию по основному столу.
  3. Когда вы найдете записи, которые хотите изменить, измените их на месте. (Это разрешено.)
  4. Когда вы найдете записи, которые хотите удалить, удалите их на месте. (Это разрешено.)
  5. Найдя записи, которые вы хотите добавить, добавьте их в другую таблицу, которая началась с пустой строки.
  6. Когда вы закончите итерацию, объедините таблицу сложений с основной.
  7. Lather. Полоскание. Повторите.

Существуют и другие похожие шаблоны с немного другими правилами, которые вы можете использовать. Например, между шагами 5 и 6 может потребоваться вставить рекурсивный вызов в код обхода таблицы для добавленных записей таблицы перед объединением и т. Д. Возможно, вам также придется отслеживать возможные удаления как в основной таблице, так и в таблице добавлений. если это возможное взаимодействие.

...