Как вытолкнуть/удалить следующий элемент (любой) в таблице пар ключ-значение в Lua?

Как в Lua можно вытолкнуть/удалить следующий элемент (в любом порядке) в таблице пар ключ-значение?

Возможно ли это без повторения с использованием pairs?


person Greg    schedule 10.12.2013    source источник
comment
На основе индекса ключа или на ассоциативной основе?   -  person greatwolf    schedule 10.12.2013
comment
ассоциативный я думаю - т.е. это=23, это=234 и т.д.   -  person Greg    schedule 10.12.2013
comment
Какой следующий пункт? Можете ли вы привести пример того, что вы пытаетесь сделать? В любом случае, чтобы удалить запись из таблицы, просто выполните t[k]=nil, где t содержит таблицу, а k содержит ключ.   -  person lhf    schedule 10.12.2013


Ответы (2)


Есть примитивная функция 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
person Yu Hao    schedule 10.12.2013

Здесь полезна глобальная функция 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")

Если вы запустите демонстрацию несколько раз, вы можете увидеть произвольную последовательность таблиц.

person Tom Blodget    schedule 11.12.2013