如何在Lua的键值对表中弹出/删除下一个项目(任何项目)?

在 Lua 中,如何弹出/删除键值对表中的下一个项目(任何顺序)?

在不使用pairs迭代的情况下是否可能实现?

点赞
用户1009479
用户1009479

有一个原始函数next,可以调用next(t,k),其中k是表t的键,返回表中的下一个键和与其关联的值。

如果knil,则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
2013-12-10 05:20:51
用户2226988
用户2226988

全局函数next在这里很有用。文档在一般情况下对其进行了很好地解释。为了按顺序使用它,这是“关键”:

您可以……修改现有字段。特别是,您可以清除现有字段。

一个简单的出栈函数:

-- 从表中删除并返回任意键-值对,否则返回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")

如果您多次运行演示,则可能会看到表序列的任意性。

2013-12-11 01:52:21