Lua таблицы реализованы в основном как хеш-таблицы.В хеш-таблице хранится массив из (key, value)
пар.
next использует хеш для быстрого перехода к тому месту, где они должны находиться в таблице.
Однако обратите внимание, что в реализации next
есть проверка nil
:
if (!ttisnil(&t->array[i])) { /* a non-nil value? */
Это потому, что когда nil
назначается ключу таблицы, он обновляет (ключ, значение) внутри хеш-таблицы, но на самом деле не удаляет эту запись.Таким образом, у вас остается (ключ, nil
) запись в хеш-таблице.Этот дизайн позволяет итерации через next
продолжать работу без изменений, когда существующим ключам присвоены значения, включая при назначении nil
.
Однако это подробности реализации .Наличие или отсутствие записи nil
в хеш-таблице полностью невидимо в API, предоставляемом реализацией таблицы.Каждая функция внешне обрабатывает эти nil
клавиши точно так же, как и отсутствие.