您可以利用表的整数部分按顺序存储键:
function add(t, k, v, ...)
if k ~= nil then
t[k] = v
t[#t+1] = k
return add(t, ...)
end
return t
end
t = add({ }, "A", "hi", "B", "my", "C", "name", "D", "is")
for i,k in ipairs(t) do
local v = t[k]
print(k, v)
end
当然,这假设整数键不被任何东西使用,除了add
.
insert(t, k, v)
and remove(t, k)
留给读者作为练习。
编辑:
省略号(点)add
函数允许根据需要传递尽可能多的参数来一次设置多个 kv 对。如果没有这个,我们每次调用只能设置一对,比如add(t, "A", "hi")
。函数定义add(t, k, v, ...)
将前三个参数分配给t, k, v
并且不影响其他人。然后add
处理第一对(t[k]=v
)并与其余部分递归...
的论点。
t k v ...
level 1: (t, "A", "hi", "B", "my", "C", "name", "D", "is")
level 2: (t, <- "B", "my", "C", "name", "D", "is")
level 3: (t, <- "C", "name", "D", "is")
level 4: (t, <- "D", "is")
level 5: (t, <- )
在5级时,k
and v
take nil
s,因为参数列表太短,递归停止。