在Lua中,如何在键值对表中弹出/删除下一项(任何顺序)?
这是否可行,而无需使用pairs
进行迭代?
答案 0 :(得分:4)
有一个原始函数next
,你可以调用next(t,k)
,其中k
是表t
的一个键,返回表中的下一个键,in任意顺序,以及与此键关联的值。
如果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
答案 1 :(得分:1)
全局函数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")
如果多次运行演示,您可能会看到表序列的随意性。