Как в Lua можно вытолкнуть/удалить следующий элемент (в любом порядке) в таблице пар ключ-значение?
Возможно ли это без повторения с использованием pairs
?
Как в Lua можно вытолкнуть/удалить следующий элемент (в любом порядке) в таблице пар ключ-значение?
Возможно ли это без повторения с использованием pairs
?
Есть примитивная функция next
, можно вызвать next(t,k)
, где k
— ключ таблицы t
, возвращает следующий ключ в таблице в произвольном порядке и значение, связанное с этим ключом.
Если k
равно nil
, next(t,k)
возвращает первый элемент, если он есть. Таким образом, вы можете перебирать таблицу от вызова next(t,nil)
и заканчивать, когда следующим ключом будет nil
.
Это простой пример, демонстрирующий использование next
:
local t = {a = "va", b = "vb", c = "vc"}
local k,v = next(t,nil)
print(k,v)
k,v = next(t,k)
print(k,v)
k,v = next(t,k)
print(k,v)
k,v = next(t,k)
print(k,v)
Выход:
a va
c vc
b vb
nil nil
Здесь полезна глобальная функция next. Документы объясняют это довольно хорошо в целом. Чтобы использовать его итеративно, это «ключ»:
Вы можете... изменить существующие поля. В частности, вы можете очистить существующие поля.
Простая всплывающая функция:
-- removes and returns an arbitrary key-value pair from a table, otherwise nil
local pop = function (t)
local key, value = next(t)
if key ~= nil then
t[key] = nil
end
return key, value
end
Демо:
local test = { "one", c = "see", "two", a = "ayy", b = "bee", "three" }
assert(next(test), "Table was expected to be non-empty")
local key, value = pop(test)
while key do
print(key, value)
key, value = pop(test)
end
assert(not next(test), "Table was expected to be empty")
Если вы запустите демонстрацию несколько раз, вы можете увидеть произвольную последовательность таблиц.
t[k]=nil
, гдеt
содержит таблицу, аk
содержит ключ. - person lhf   schedule 10.12.2013